changeset 9193:f6b7837b89aa

Zusammenführen
author gernotbelger
date Fri, 29 Jun 2018 12:46:17 +0200
parents ed4b14389667 (current diff) f692f5a0536a (diff)
children c373909fb7ca
files artifacts/doc/conf/jasper/templates/uinfo.inundationduration.jrxml artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResults.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java
diffstat 24 files changed, 564 insertions(+), 930 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/uinfo.xml	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/doc/conf/artifacts/uinfo.xml	Fri Jun 29 12:46:17 2018 +0200
@@ -222,10 +222,21 @@
             <facet name="floodmap.floodmaps" />
             <facet name="floodmap.gauge_location" />
             <facet name="floodmap.externalwms" />
+            <facet name="floodmap.externalwms_1" />
+            <facet name="floodmap.externalwms_2" />
+            <facet name="floodmap.externalwms_3" />
+            <facet name="floodmap.externalwms_4" />
             <facet name="floodmap.jetties" />
           </facets>
         </outputmode>
 
+        <!-- FIXME: i01n name in FLYSConstants -->
+        <outputmode name="uinfo_inundation_duration_export" description="output.uinfo_inundation_duration_export" mime-type="text/plain" type="export">
+          <facets>
+            <facet name="wms_url" description="XXXXXXXXXX _ no entry in generators necessary either" />
+          </facets>
+        </outputmode>
+
         <outputmode name="uinfo_inundation_duration_report" description="output.uinfo_inundation_duration_report" mime-type="text/xml" type="report">
           <facets>
             <facet name="report" description="facet.uinfo_inundation_duration_report" />
--- a/artifacts/doc/conf/generators/generators.xml	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/doc/conf/generators/generators.xml	Fri Jun 29 12:46:17 2018 +0200
@@ -3,76 +3,80 @@
     &longitudinal-diagrams;
     &discharge-diagrams;
 
-    <output-generator names="cross_section" class="org.dive4elements.river.exports.CrossSectionGenerator"/>
-    <output-generator names="cross_section_chartinfo" class="org.dive4elements.river.exports.CrossSectionInfoGenerator"/>
-    <output-generator names="duration_curve" class="org.dive4elements.river.exports.DurationCurveGenerator"/>
-    <output-generator names="duration_curve_chartinfo" class="org.dive4elements.river.exports.DurationCurveInfoGenerator"/>
-    <output-generator names="waterlevel_export" class="org.dive4elements.river.exports.WaterlevelExporter"/>
+  <output-generator names="cross_section" class="org.dive4elements.river.exports.CrossSectionGenerator" />
+  <output-generator names="cross_section_chartinfo" class="org.dive4elements.river.exports.CrossSectionInfoGenerator" />
+  <output-generator names="duration_curve" class="org.dive4elements.river.exports.DurationCurveGenerator" />
+  <output-generator names="duration_curve_chartinfo" class="org.dive4elements.river.exports.DurationCurveInfoGenerator" />
+  <output-generator names="waterlevel_export" class="org.dive4elements.river.exports.WaterlevelExporter" />
 
-    <output-generator names="historical_discharge_chartinfo" class="org.dive4elements.river.exports.HistoricalDischargeCurveInfoGenerator"/>
-    <output-generator names="historical_discharge" class="org.dive4elements.river.exports.HistoricalDischargeCurveGenerator"/>
+  <output-generator names="historical_discharge_chartinfo" class="org.dive4elements.river.exports.HistoricalDischargeCurveInfoGenerator" />
+  <output-generator names="historical_discharge" class="org.dive4elements.river.exports.HistoricalDischargeCurveGenerator" />
 
-    <!-- This is deactivated.
+  <!-- This is deactivated.
     <output-generator names="extreme_wq_curve" class="org.dive4elements.river.exports.extreme.ExtremeWQCurveGenerator"/>
     <output-generator names="extreme_curve_export" class="org.dive4elements.river.exports.WaterlevelExporter"/>
     <output-generator names="extreme_wq_curve_chartinfo" class="org.dive4elements.river.exports.extreme.ExtremeWQCurveInfoGenerator"/>
-    -->
+  -->
 
-    <output-generator names="durationcurve_export" class="org.dive4elements.river.exports.DurationCurveExporter"/>
-    <output-generator names="computed_dischargecurve_export" class="org.dive4elements.river.exports.ComputedDischargeCurveExporter"/>
-    <output-generator names="discharge_longitudinal_section_export" class="org.dive4elements.river.exports.DischargeLongitudinalSectionExporter"/>
-    <output-generator names="w_differences_export" class="org.dive4elements.river.exports.WDifferencesExporter"/>
-    <output-generator names="floodmap" class="org.dive4elements.river.exports.MapGenerator"/>
-    <output-generator names="map" class="org.dive4elements.river.exports.MapGenerator"/>
-    <output-generator names="reference_curve" class="org.dive4elements.river.exports.ReferenceCurveGenerator"/>
-    <output-generator names="reference_curve_normalized" class="org.dive4elements.river.exports.NormalizedReferenceCurveGenerator"/>
-    <output-generator names="reference_curve_normalized_chartinfo" class="org.dive4elements.river.exports.NormalizedReferenceCurveInfoGenerator"/>
-    <output-generator names="reference_curve_chartinfo" class="org.dive4elements.river.exports.ReferenceCurveInfoGenerator"/>
-    <output-generator names="reference_curve_export" class="org.dive4elements.river.exports.ReferenceCurveExporter"/>
-    <output-generator names="historical_discharge_export" class="org.dive4elements.river.exports.HistoricalDischargeCurveExporter"/>
-    <output-generator names="flow_velocity_export" class="org.dive4elements.river.exports.FlowVelocityExporter"/>
-    <output-generator names="bedheight_middle_export" class="org.dive4elements.river.exports.MiddleBedHeightExporter"/>
-    <output-generator names="bed_quality_export" class="org.dive4elements.river.exports.minfo.BedQualityExporter"/>
-    <output-generator names="bedheight_difference_export" class="org.dive4elements.river.exports.minfo.BedDifferenceExporter"/>
-    <output-generator names="sq_relation_export" class="org.dive4elements.river.exports.sq.SQRelationExporter"/>
-    <output-generator names="fix_parameters_export" class="org.dive4elements.river.exports.fixings.ParametersExporter"/>
-    <output-generator names="fix_deltawt_export" class="org.dive4elements.river.exports.fixings.DeltaWtExporter"/>
-    <output-generator names="fix_deltawt_curve" class="org.dive4elements.river.exports.fixings.FixDeltaWtGenerator"/>
-    <output-generator names="fix_deltawt_curve_chartinfo" class="org.dive4elements.river.exports.fixings.FixDeltaWtInfoGenerator"/>
-    <output-generator names="fix_waterlevel_export" class="org.dive4elements.river.exports.WaterlevelExporter"/>
-    <output-generator names="sedimentload_ls_export" class="org.dive4elements.river.exports.minfo.SedimentLoadExporter"/>
-    <!-- Error report generators. -->
-    <output-generator names="discharge_longitudinal_section_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="waterlevel_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="computed_dischargecurve_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="durationcurve_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="wsplgen_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="historical_discharge_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="reference_curve_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="fix_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="extreme_curve_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="sedimentload_ls_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="bed_quality_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <!-- AT exporter. -->
-    <output-generator names="computed_dischargecurve_at_export" class="org.dive4elements.river.exports.ATExporter"/>
-    <output-generator names="gauge_discharge_curve_at_export" class="org.dive4elements.river.exports.ATExporter"/>
-    <output-generator names="fix_wq_curve_at_export" class="org.dive4elements.river.exports.fixings.FixATExport"/>
-    <output-generator names="wsplgen" class="org.dive4elements.river.exports.ShapeExporter"/>
+  <output-generator names="durationcurve_export" class="org.dive4elements.river.exports.DurationCurveExporter" />
+  <output-generator names="computed_dischargecurve_export" class="org.dive4elements.river.exports.ComputedDischargeCurveExporter" />
+  <output-generator names="discharge_longitudinal_section_export" class="org.dive4elements.river.exports.DischargeLongitudinalSectionExporter" />
+  <output-generator names="w_differences_export" class="org.dive4elements.river.exports.WDifferencesExporter" />
+  <output-generator names="floodmap" class="org.dive4elements.river.exports.MapGenerator" />
+  <output-generator names="map" class="org.dive4elements.river.exports.MapGenerator" />
+  <output-generator names="reference_curve" class="org.dive4elements.river.exports.ReferenceCurveGenerator" />
+  <output-generator names="reference_curve_normalized" class="org.dive4elements.river.exports.NormalizedReferenceCurveGenerator" />
+  <output-generator names="reference_curve_normalized_chartinfo" class="org.dive4elements.river.exports.NormalizedReferenceCurveInfoGenerator" />
+  <output-generator names="reference_curve_chartinfo" class="org.dive4elements.river.exports.ReferenceCurveInfoGenerator" />
+  <output-generator names="reference_curve_export" class="org.dive4elements.river.exports.ReferenceCurveExporter" />
+  <output-generator names="historical_discharge_export" class="org.dive4elements.river.exports.HistoricalDischargeCurveExporter" />
+  <output-generator names="flow_velocity_export" class="org.dive4elements.river.exports.FlowVelocityExporter" />
+  <output-generator names="bedheight_middle_export" class="org.dive4elements.river.exports.MiddleBedHeightExporter" />
+  <output-generator names="bed_quality_export" class="org.dive4elements.river.exports.minfo.BedQualityExporter" />
+  <output-generator names="bedheight_difference_export" class="org.dive4elements.river.exports.minfo.BedDifferenceExporter" />
+  <output-generator names="sq_relation_export" class="org.dive4elements.river.exports.sq.SQRelationExporter" />
+  <output-generator names="fix_parameters_export" class="org.dive4elements.river.exports.fixings.ParametersExporter" />
+  <output-generator names="fix_deltawt_export" class="org.dive4elements.river.exports.fixings.DeltaWtExporter" />
+  <output-generator names="fix_deltawt_curve" class="org.dive4elements.river.exports.fixings.FixDeltaWtGenerator" />
+  <output-generator names="fix_deltawt_curve_chartinfo" class="org.dive4elements.river.exports.fixings.FixDeltaWtInfoGenerator" />
+  <output-generator names="fix_waterlevel_export" class="org.dive4elements.river.exports.WaterlevelExporter" />
+  <output-generator names="sedimentload_ls_export" class="org.dive4elements.river.exports.minfo.SedimentLoadExporter" />
+  <!-- Error report generators. -->
+  <output-generator names="discharge_longitudinal_section_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="waterlevel_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="computed_dischargecurve_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="durationcurve_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="wsplgen_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="historical_discharge_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="reference_curve_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="fix_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="extreme_curve_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="sedimentload_ls_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="bed_quality_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <!-- AT exporter. -->
+  <output-generator names="computed_dischargecurve_at_export" class="org.dive4elements.river.exports.ATExporter" />
+  <output-generator names="gauge_discharge_curve_at_export" class="org.dive4elements.river.exports.ATExporter" />
+  <output-generator names="fix_wq_curve_at_export" class="org.dive4elements.river.exports.fixings.FixATExport" />
+  <output-generator names="wsplgen" class="org.dive4elements.river.exports.ShapeExporter" />
 
-    <!-- SINFO -->
-    <output-generator names="sinfo_flowdepth_export" class="org.dive4elements.river.artifacts.sinfo.flowdepth.FlowDepthExporter"/>
-    <output-generator names="sinfo_flowdepth_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="sinfo_flowdepthminmax_export" class="org.dive4elements.river.artifacts.sinfo.flowdepthminmax.FlowDepthMinMaxExporter"/>
-    <output-generator names="sinfo_flowdepthminmax_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="sinfo_flowdepthdevelopment_export" class="org.dive4elements.river.artifacts.sinfo.flowdepthdev.FlowDepthDevelopmentExporter"/>
-    <output-generator names="sinfo_flowdepthdevelopment_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="sinfo_tkh_export" class="org.dive4elements.river.artifacts.sinfo.tkhstate.TkhExporter"/>
-    <output-generator names="sinfo_tkh_report" class="org.dive4elements.river.exports.ReportGenerator"/>
-    <output-generator names="sinfo_floodduration_export" class="org.dive4elements.river.artifacts.sinfo.flood_duration.FloodDurationExporter" />
-    <output-generator names="sinfo_collision_export" class="org.dive4elements.river.artifacts.sinfo.collision.CollisionExporter" />
-    
-    <!-- UINFO -->
-    <output-generator names="uinfo_salix_line_export" class="org.dive4elements.river.artifacts.uinfo.salix.SalixLineExporter"/> 
-    <output-generator names="uinfo_inundation_duration_export" class="org.dive4elements.river.artifacts.uinfo.inundationduration.InundationDurationExporter"/>
-    <output-generator names="uinfo_vegetation_zones_export" class="org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZonesExporter"/>
+  <!-- SINFO -->
+  <output-generator names="sinfo_flowdepth_export" class="org.dive4elements.river.artifacts.sinfo.flowdepth.FlowDepthExporter" />
+  <output-generator names="sinfo_flowdepth_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="sinfo_flowdepthminmax_export" class="org.dive4elements.river.artifacts.sinfo.flowdepthminmax.FlowDepthMinMaxExporter" />
+  <output-generator names="sinfo_flowdepthminmax_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="sinfo_flowdepthdevelopment_export" class="org.dive4elements.river.artifacts.sinfo.flowdepthdev.FlowDepthDevelopmentExporter" />
+  <output-generator names="sinfo_flowdepthdevelopment_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="sinfo_tkh_export" class="org.dive4elements.river.artifacts.sinfo.tkhstate.TkhExporter" />
+  <output-generator names="sinfo_tkh_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="sinfo_floodduration_export" class="org.dive4elements.river.artifacts.sinfo.flood_duration.FloodDurationExporter" />
+  <output-generator names="sinfo_floodduration_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="sinfo_collision_export" class="org.dive4elements.river.artifacts.sinfo.collision.CollisionExporter" />
+  <output-generator names="sinfo_collision_report" class="org.dive4elements.river.exports.ReportGenerator" />
+
+  <!-- UINFO -->
+  <output-generator names="uinfo_inundation_duration_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="uinfo_salix_line_export" class="org.dive4elements.river.artifacts.uinfo.salix.SalixLineExporter" />
+  <output-generator names="uinfo_salix_line_report" class="org.dive4elements.river.exports.ReportGenerator" />
+  <output-generator names="uinfo_vegetation_zones_export" class="org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZonesExporter" />
+  <output-generator names="uinfo_vegetation_zones_report" class="org.dive4elements.river.exports.ReportGenerator" />
 </output-generators>
\ No newline at end of file
--- a/artifacts/doc/conf/jasper/templates/sinfo.collision.detail.jrxml	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/doc/conf/jasper/templates/sinfo.collision.detail.jrxml	Fri Jun 29 12:46:17 2018 +0200
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 4.5.0  -->
-<!-- 2018-06-22T14:12:56 -->
+<!-- 2018-06-28T15:32:43 -->
 <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="flysreport" language="groovy" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="60" rightMargin="20" topMargin="20" bottomMargin="20">
 	<property name="ireport.zoom" value="1.0"/>
 	<property name="ireport.x" value="0"/>
@@ -99,15 +99,7 @@
 		<band splitType="Stretch"/>
 	</background>
 	<title>
-		<band height="30" splitType="Stretch">
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="0" width="515" height="30"/>
-				<textElement>
-					<font size="18"/>
-				</textElement>
-				<textFieldExpression><![CDATA[$F{meta:header} + " " + $F{meta:river}]]></textFieldExpression>
-			</textField>
-		</band>
+		<band splitType="Stretch"/>
 	</title>
 	<columnHeader>
 		<band height="25" splitType="Stretch">
--- a/artifacts/doc/conf/jasper/templates/uinfo.inundationduration.jrxml	Thu Jun 28 19:13:14 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 4.5.0  -->
-<!-- 2018-06-06T13:16:01 -->
-<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="flysreport" language="groovy" pageWidth="595" pageHeight="842" columnWidth="545" leftMargin="30" rightMargin="20" topMargin="20" bottomMargin="20">
-	<property name="ireport.zoom" value="1.0"/>
-	<property name="ireport.x" value="0"/>
-	<property name="ireport.y" value="0"/>
-	<style name="htmlStyle" isDefault="true" mode="Transparent" markup="html" fontName="Roboto"/>
-	<field name="meta:header" class="java.lang.String"/>
-	<field name="meta:calcMode" class="java.lang.String"/>
-	<field name="meta:version_label" class="java.lang.String"/>
-	<field name="meta:version" class="java.lang.String"/>
-	<field name="meta:user_label" class="java.lang.String"/>
-	<field name="meta:user" class="java.lang.String"/>
-	<field name="meta:date_label" class="java.lang.String"/>
-	<field name="meta:date" class="java.lang.String"/>
-	<field name="meta:river_label" class="java.lang.String"/>
-	<field name="meta:river" class="java.lang.String"/>
-	<field name="meta:range_label" class="java.lang.String"/>
-	<field name="meta:range" class="java.lang.String"/>
-	<field name="meta:calculation_label" class="java.lang.String"/>
-	<field name="meta:calculation_name" class="java.lang.String"/>
-	<field name="meta:station_header" class="java.lang.String"/>
-	<field name="meta:flowdepthdevelopment_header" class="java.lang.String"/>
-	<field name="meta:flowdepthdevelopmentperyear_header" class="java.lang.String"/>
-	<field name="meta:waterleveldifference_header" class="java.lang.String"/>
-	<field name="meta:waterleveldifference_header2" class="java.lang.String"/>
-	<field name="meta:waterleveldifference_header_label" class="java.lang.String"/>
-	<field name="meta:bedheightdifference_header" class="java.lang.String"/>
-	<field name="meta:bedheightdifference_header2" class="java.lang.String"/>
-	<field name="meta:bedheightdifference_header_label" class="java.lang.String"/>
-	<field name="meta:flowdepthcurrent_header" class="java.lang.String"/>
-	<field name="meta:flowdepthcurrent_header2" class="java.lang.String"/>
-	<field name="meta:flowdepthhistorical_header" class="java.lang.String"/>
-	<field name="meta:flowdepthhistorical_header2" class="java.lang.String"/>
-	<field name="meta:flowdepthcurrent_header_label" class="java.lang.String"/>
-	<field name="meta:flowdepthhistorical_header_label" class="java.lang.String"/>
-	<field name="meta:flowdepth_header" class="java.lang.String"/>
-	<field name="meta:flowdepthdevelopment" class="java.lang.String"/>
-	<field name="meta:flowdepthmin_header" class="java.lang.String"/>
-	<field name="meta:flowdepthmax_header" class="java.lang.String"/>
-	<field name="meta:flowdepthdevelopment_header_label" class="java.lang.String"/>
-	<field name="meta:flowdepth_tkh_header" class="java.lang.String"/>
-	<field name="meta:tkh_header" class="java.lang.String"/>
-	<field name="meta:tkhkind_header" class="java.lang.String"/>
-	<field name="meta:waterlevel_header" class="java.lang.String"/>
-	<field name="meta:discharge_header" class="java.lang.String"/>
-	<field name="meta:waterlevel_name_header" class="java.lang.String"/>
-	<field name="meta:gauge_header" class="java.lang.String"/>
-	<field name="meta:bedheight_header" class="java.lang.String"/>
-	<field name="meta:sounding_name_header" class="java.lang.String"/>
-	<field name="meta:location_header" class="java.lang.String"/>
-	<field name="meta:river_unit" class="java.lang.String"/>
-	<field name="data:0" class="java.lang.String"/>
-	<field name="data:1" class="java.lang.String"/>
-	<field name="data:2" class="java.lang.String"/>
-	<field name="data:3" class="java.lang.String"/>
-	<field name="data:4" class="java.lang.String"/>
-	<field name="data:5" class="java.lang.String"/>
-	<field name="data:6" class="java.lang.String"/>
-	<field name="data:7" class="java.lang.String"/>
-	<field name="data:8" class="java.lang.String"/>
-	<background>
-		<band splitType="Stretch"/>
-	</background>
-	<title>
-		<band height="169" splitType="Stretch">
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="0" width="515" height="30"/>
-				<textElement>
-					<font size="18"/>
-				</textElement>
-				<textFieldExpression><![CDATA[$F{meta:header} + " " + $F{meta:river}]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="39" width="165" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:calcMode}]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="69" width="123" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:version_label} + ":"]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="123" y="69" width="392" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:version}]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="89" width="123" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:user_label} + ":"]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="123" y="89" width="392" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:user}]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="109" width="123" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:date_label} + ":"]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="123" y="109" width="392" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:date}]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="129" width="123" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:river_label} + ":"]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="123" y="129" width="392" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:river}]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="0" y="149" width="123" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:range_label} + ":"]]></textFieldExpression>
-			</textField>
-			<textField>
-				<reportElement style="htmlStyle" x="123" y="149" width="392" height="20"/>
-				<textFieldExpression><![CDATA[$F{meta:range}]]></textFieldExpression>
-			</textField>
-		</band>
-	</title>
-	<columnHeader>
-		<band height="25" splitType="Stretch">
-			<textField isStretchWithOverflow="true">
-				<reportElement style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="0" y="0" width="80" height="24"/>
-				<box padding="5"/>
-				<textElement textAlignment="Right" verticalAlignment="Bottom"/>
-				<textFieldExpression><![CDATA[$F{meta:station_header}]]></textFieldExpression>
-			</textField>
-			<textField isStretchWithOverflow="true">
-				<reportElement style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="80" y="0" width="90" height="24"/>
-				<box padding="5"/>
-				<textElement textAlignment="Right" verticalAlignment="Bottom"/>
-				<textFieldExpression><![CDATA[$F{meta:tkh_header} + "<br/>[cm]"]]></textFieldExpression>
-			</textField>
-			<textField isStretchWithOverflow="true">
-				<reportElement key="" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="170" y="0" width="380" height="24"/>
-				<box padding="5"/>
-				<textElement verticalAlignment="Bottom"/>
-				<textFieldExpression><![CDATA[$F{meta:tkhkind_header}]]></textFieldExpression>
-			</textField>
-			<line>
-				<reportElement style="htmlStyle" positionType="FixRelativeToBottom" x="0" y="24" width="550" height="1"/>
-			</line>
-		</band>
-	</columnHeader>
-	<detail>
-		<band height="15" splitType="Prevent">
-			<textField isStretchWithOverflow="true" isBlankWhenNull="true">
-				<reportElement style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="0" y="0" width="80" height="15"/>
-				<box topPadding="2" leftPadding="5" bottomPadding="0" rightPadding="5">
-					<topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<bottomPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-				</box>
-				<textElement textAlignment="Right" verticalAlignment="Top"/>
-				<textFieldExpression><![CDATA[$F{data:0}]]></textFieldExpression>
-			</textField>
-			<textField isStretchWithOverflow="true" isBlankWhenNull="true">
-				<reportElement style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="80" y="0" width="90" height="15"/>
-				<box topPadding="2" leftPadding="5" bottomPadding="0" rightPadding="5">
-					<topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<bottomPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-				</box>
-				<textElement textAlignment="Right"/>
-				<textFieldExpression><![CDATA[$F{data:1}]]></textFieldExpression>
-			</textField>
-			<textField isStretchWithOverflow="true" isBlankWhenNull="true">
-				<reportElement key="" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="170" y="0" width="380" height="15"/>
-				<box topPadding="2" leftPadding="5" bottomPadding="0" rightPadding="5">
-					<topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<bottomPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-					<rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
-				</box>
-				<textElement textAlignment="Left"/>
-				<textFieldExpression><![CDATA[$F{data:2}]]></textFieldExpression>
-			</textField>
-		</band>
-	</detail>
-	<pageFooter>
-		<band height="15" splitType="Stretch">
-			<textField isStretchWithOverflow="true">
-				<reportElement style="htmlStyle" x="437" y="0" width="55" height="15"/>
-				<box topPadding="2" rightPadding="3"/>
-				<textElement textAlignment="Right"/>
-				<textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
-			</textField>
-			<textField isStretchWithOverflow="true" evaluationTime="Report">
-				<reportElement style="htmlStyle" x="493" y="0" width="57" height="15"/>
-				<box topPadding="2" rightPadding="3"/>
-				<textFieldExpression><![CDATA["/ " + $V{PAGE_NUMBER}]]></textFieldExpression>
-			</textField>
-		</band>
-	</pageFooter>
-	<summary>
-		<band height="30" splitType="Stretch"/>
-	</summary>
-</jasperReport>
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java	Fri Jun 29 12:46:17 2018 +0200
@@ -11,143 +11,92 @@
 /** 'Types' of facets. */
 public interface FacetTypes {
 
-    /** Static helper class to determine if a Facet name is of a generalized
-     * 'type'. */
+    /**
+     * Static helper class to determine if a Facet name is of a generalized
+     * 'type'.
+     */
     public static class IS {
-        public static boolean WQ_KM(String type) {
-           return type.equals(DISCHARGE_LONGITUDINAL_W)
-               || type.equals(LONGITUDINAL_W);
-        }
-        public static boolean W_KM(String type) {
-            return type.equals(STATIC_WKMS)
-               || type.equals(HEIGHTMARKS_POINTS)
-               || WQ_KM(type);
-        }
-        public static boolean AREA(String type) {
-            return type.equals(AREA)
-                || type.equals(CROSS_SECTION_AREA)
-                || type.equals(LONGITUDINAL_SECTION_AREA);
+        public static boolean WQ_KM(final String type) {
+            return type.equals(DISCHARGE_LONGITUDINAL_W) || type.equals(LONGITUDINAL_W);
         }
-        public static boolean W(String type) {
-            return type.equals(LONGITUDINAL_W)
-                || type.equals(DISCHARGE_LONGITUDINAL_W)
-                || type.equals(DURATION_W)
-                || type.equals(STATIC_WKMS)
-                || type.equals(STATIC_WQKMS_W);
+
+        public static boolean W_KM(final String type) {
+            return type.equals(STATIC_WKMS) || type.equals(HEIGHTMARKS_POINTS) || WQ_KM(type);
         }
-        public static boolean Q(String type) {
-            return type.equals(LONGITUDINAL_Q)
-                || type.equals(DISCHARGE_LONGITUDINAL_Q)
-                || type.equals(DURATION_Q)
-                || type.equals(STATIC_WQKMS_Q);
+
+        public static boolean AREA(final String type) {
+            return type.equals(AREA) || type.equals(CROSS_SECTION_AREA) || type.equals(LONGITUDINAL_SECTION_AREA);
         }
-        public static boolean V(String type) {
-            return type.equals(FLOW_VELOCITY_MAINCHANNEL)
-                || type.equals(FLOW_VELOCITY_TOTALCHANNEL);
+
+        public static boolean W(final String type) {
+            return type.equals(LONGITUDINAL_W) || type.equals(DISCHARGE_LONGITUDINAL_W) || type.equals(DURATION_W) || type.equals(STATIC_WKMS)
+                    || type.equals(STATIC_WQKMS_W);
         }
-        public static boolean T(String type) {
+
+        public static boolean Q(final String type) {
+            return type.equals(LONGITUDINAL_Q) || type.equals(DISCHARGE_LONGITUDINAL_Q) || type.equals(DURATION_Q) || type.equals(STATIC_WQKMS_Q);
+        }
+
+        public static boolean V(final String type) {
+            return type.equals(FLOW_VELOCITY_MAINCHANNEL) || type.equals(FLOW_VELOCITY_TOTALCHANNEL);
+        }
+
+        public static boolean T(final String type) {
             return type.equals(FLOW_VELOCITY_TAU);
         }
-        public static boolean H(String type) {
+
+        public static boolean H(final String type) {
             return type.equals(MIDDLE_BED_HEIGHT_SINGLE);
         }
-        public static boolean MANUALPOINTS(String type) {
+
+        public static boolean MANUALPOINTS(final String type) {
             return type.endsWith("manualpoints");
         }
-        public static boolean MANUALLINE(String type) {
+
+        public static boolean MANUALLINE(final String type) {
             return type.endsWith("manualline");
         }
-        public static boolean FILTERED(String type) {
+
+        public static boolean FILTERED(final String type) {
             return type.endsWith("filtered");
         }
-        public static boolean SQ_CURVE(String type) {
-            if (type.equals(SQ_A_CURVE)
-                || type.equals(SQ_B_CURVE)
-                || type.equals(SQ_C_CURVE)
-                || type.equals(SQ_D_CURVE)
-                || type.equals(SQ_E_CURVE)
-                || type.equals(SQ_F_CURVE)
-                || type.equals(SQ_G_CURVE)
-                || type.equals(SQ_A_OUTLIER_CURVE)
-                || type.equals(SQ_B_OUTLIER_CURVE)
-                || type.equals(SQ_C_OUTLIER_CURVE)
-                || type.equals(SQ_D_OUTLIER_CURVE)
-                || type.equals(SQ_E_OUTLIER_CURVE)
-                || type.equals(SQ_F_OUTLIER_CURVE)
-                || type.equals(SQ_G_OUTLIER_CURVE)
-                || type.equals(SQ_A_CURVE_OV)
-                || type.equals(SQ_B_CURVE_OV)
-                || type.equals(SQ_C_CURVE_OV)
-                || type.equals(SQ_D_CURVE_OV)
-                || type.equals(SQ_E_CURVE_OV)
-                || type.equals(SQ_F_CURVE_OV)
-                || type.equals(SQ_G_CURVE_OV)
-                || type.equals(SQ_A_OUTLIER_CURVE_OV)
-                || type.equals(SQ_B_OUTLIER_CURVE_OV)
-                || type.equals(SQ_C_OUTLIER_CURVE_OV)
-                || type.equals(SQ_D_OUTLIER_CURVE_OV)
-                || type.equals(SQ_E_OUTLIER_CURVE_OV)
-                || type.equals(SQ_F_OUTLIER_CURVE_OV)
-                || type.equals(SQ_G_OUTLIER_CURVE_OV)
-                )
-            {
+
+        public static boolean SQ_CURVE(final String type) {
+            if (type.equals(SQ_A_CURVE) || type.equals(SQ_B_CURVE) || type.equals(SQ_C_CURVE) || type.equals(SQ_D_CURVE) || type.equals(SQ_E_CURVE)
+                    || type.equals(SQ_F_CURVE) || type.equals(SQ_G_CURVE) || type.equals(SQ_A_OUTLIER_CURVE) || type.equals(SQ_B_OUTLIER_CURVE)
+                    || type.equals(SQ_C_OUTLIER_CURVE) || type.equals(SQ_D_OUTLIER_CURVE) || type.equals(SQ_E_OUTLIER_CURVE) || type.equals(SQ_F_OUTLIER_CURVE)
+                    || type.equals(SQ_G_OUTLIER_CURVE) || type.equals(SQ_A_CURVE_OV) || type.equals(SQ_B_CURVE_OV) || type.equals(SQ_C_CURVE_OV)
+                    || type.equals(SQ_D_CURVE_OV) || type.equals(SQ_E_CURVE_OV) || type.equals(SQ_F_CURVE_OV) || type.equals(SQ_G_CURVE_OV)
+                    || type.equals(SQ_A_OUTLIER_CURVE_OV) || type.equals(SQ_B_OUTLIER_CURVE_OV) || type.equals(SQ_C_OUTLIER_CURVE_OV)
+                    || type.equals(SQ_D_OUTLIER_CURVE_OV) || type.equals(SQ_E_OUTLIER_CURVE_OV) || type.equals(SQ_F_OUTLIER_CURVE_OV)
+                    || type.equals(SQ_G_OUTLIER_CURVE_OV)) {
                 return true;
             }
 
             return false;
         }
-        public static boolean SQ_MEASUREMENT(String type) {
-            if (type.equals(SQ_A_MEASUREMENT)
-                || type.equals(SQ_B_MEASUREMENT)
-                || type.equals(SQ_C_MEASUREMENT)
-                || type.equals(SQ_D_MEASUREMENT)
-                || type.equals(SQ_E_MEASUREMENT)
-                || type.equals(SQ_F_MEASUREMENT)
-                || type.equals(SQ_G_MEASUREMENT)
-                || type.equals(SQ_A_OUTLIER_MEASUREMENT)
-                || type.equals(SQ_B_OUTLIER_MEASUREMENT)
-                || type.equals(SQ_C_OUTLIER_MEASUREMENT)
-                || type.equals(SQ_D_OUTLIER_MEASUREMENT)
-                || type.equals(SQ_E_OUTLIER_MEASUREMENT)
-                || type.equals(SQ_F_OUTLIER_MEASUREMENT)
-                || type.equals(SQ_G_OUTLIER_MEASUREMENT)
-                || type.equals(SQ_A_MEASUREMENT_OV)
-                || type.equals(SQ_B_MEASUREMENT_OV)
-                || type.equals(SQ_C_MEASUREMENT_OV)
-                || type.equals(SQ_D_MEASUREMENT_OV)
-                || type.equals(SQ_E_MEASUREMENT_OV)
-                || type.equals(SQ_F_MEASUREMENT_OV)
-                || type.equals(SQ_G_MEASUREMENT_OV)
-                || type.equals(SQ_A_OUTLIER_MEASUREMENT_OV)
-                || type.equals(SQ_B_OUTLIER_MEASUREMENT_OV)
-                || type.equals(SQ_C_OUTLIER_MEASUREMENT_OV)
-                || type.equals(SQ_D_OUTLIER_MEASUREMENT_OV)
-                || type.equals(SQ_E_OUTLIER_MEASUREMENT_OV)
-                || type.equals(SQ_F_OUTLIER_MEASUREMENT_OV)
-                || type.equals(SQ_G_OUTLIER_MEASUREMENT_OV)
-                )
-            {
+
+        public static boolean SQ_MEASUREMENT(final String type) {
+            if (type.equals(SQ_A_MEASUREMENT) || type.equals(SQ_B_MEASUREMENT) || type.equals(SQ_C_MEASUREMENT) || type.equals(SQ_D_MEASUREMENT)
+                    || type.equals(SQ_E_MEASUREMENT) || type.equals(SQ_F_MEASUREMENT) || type.equals(SQ_G_MEASUREMENT) || type.equals(SQ_A_OUTLIER_MEASUREMENT)
+                    || type.equals(SQ_B_OUTLIER_MEASUREMENT) || type.equals(SQ_C_OUTLIER_MEASUREMENT) || type.equals(SQ_D_OUTLIER_MEASUREMENT)
+                    || type.equals(SQ_E_OUTLIER_MEASUREMENT) || type.equals(SQ_F_OUTLIER_MEASUREMENT) || type.equals(SQ_G_OUTLIER_MEASUREMENT)
+                    || type.equals(SQ_A_MEASUREMENT_OV) || type.equals(SQ_B_MEASUREMENT_OV) || type.equals(SQ_C_MEASUREMENT_OV)
+                    || type.equals(SQ_D_MEASUREMENT_OV) || type.equals(SQ_E_MEASUREMENT_OV) || type.equals(SQ_F_MEASUREMENT_OV)
+                    || type.equals(SQ_G_MEASUREMENT_OV) || type.equals(SQ_A_OUTLIER_MEASUREMENT_OV) || type.equals(SQ_B_OUTLIER_MEASUREMENT_OV)
+                    || type.equals(SQ_C_OUTLIER_MEASUREMENT_OV) || type.equals(SQ_D_OUTLIER_MEASUREMENT_OV) || type.equals(SQ_E_OUTLIER_MEASUREMENT_OV)
+                    || type.equals(SQ_F_OUTLIER_MEASUREMENT_OV) || type.equals(SQ_G_OUTLIER_MEASUREMENT_OV)) {
                 return true;
             }
 
             return false;
         }
-        public static boolean SQ_OUTLIER(String type) {
-            if (type.equals(SQ_A_OUTLIER)
-                || type.equals(SQ_B_OUTLIER)
-                || type.equals(SQ_C_OUTLIER)
-                || type.equals(SQ_D_OUTLIER)
-                || type.equals(SQ_E_OUTLIER)
-                || type.equals(SQ_F_OUTLIER)
-                || type.equals(SQ_G_OUTLIER)
-                || type.equals(SQ_A_OUTLIER_OV)
-                || type.equals(SQ_B_OUTLIER_OV)
-                || type.equals(SQ_C_OUTLIER_OV)
-                || type.equals(SQ_D_OUTLIER_OV)
-                || type.equals(SQ_E_OUTLIER_OV)
-                || type.equals(SQ_F_OUTLIER_OV)
-                || type.equals(SQ_G_OUTLIER_OV))
-            {
+
+        public static boolean SQ_OUTLIER(final String type) {
+            if (type.equals(SQ_A_OUTLIER) || type.equals(SQ_B_OUTLIER) || type.equals(SQ_C_OUTLIER) || type.equals(SQ_D_OUTLIER) || type.equals(SQ_E_OUTLIER)
+                    || type.equals(SQ_F_OUTLIER) || type.equals(SQ_G_OUTLIER) || type.equals(SQ_A_OUTLIER_OV) || type.equals(SQ_B_OUTLIER_OV)
+                    || type.equals(SQ_C_OUTLIER_OV) || type.equals(SQ_D_OUTLIER_OV) || type.equals(SQ_E_OUTLIER_OV) || type.equals(SQ_F_OUTLIER_OV)
+                    || type.equals(SQ_G_OUTLIER_OV)) {
                 return true;
             }
 
@@ -155,51 +104,26 @@
         }
     }
 
-    /** Available diagram/chart-types.  This enum is evaluated at certain
+    /**
+     * Available diagram/chart-types. This enum is evaluated at certain
      * places to iterate over chart-types to e.g. dynamically generate
-     * Facet-names (ManualPoints for example). */
+     * Facet-names (ManualPoints for example).
+     */
     public enum ChartType {
-        FD("fix_derivate_curve"),
-        LS("longitudinal_section"),
-        CS("cross_section"),
-        DLS("discharge_longitudinal_section"),
-        CDC("computed_discharge_curve"),
-        DUC("duration_curve"),
-        DIC("discharge_curve"),
-        RC("reference_curve"),
-        RCN("reference_curve_normalized"),
-        WD("wdifferences"),
-        BHDY("bedheight_difference_height_year"),
-        BDY("bed_difference_year"),
-        FWQC("fix_wq_curve"),
-        FDWC("fix_deltawt_curve"),
-        FLSC("fix_longitudinal_section_curve"),
-        FDC("fix_derivate_curve"),
-        EWQ("extreme_wq_curve"),
-        BHM("bedheight_middle"),
-        BLS("bed_longitudinal_section"),
-        SLS("sedimentload_ls"),
-        FV("flow_velocity"),
-        SQA("sq_relation_a"),
-        SQB("sq_relation_b"),
-        W_D("w_differences"),
-        SQC("sq_relation_c"),
-        SQD("sq_relation_d"),
-        SQE("sq_relation_e"),
-        SQF("sq_relation_f"),
-        HD("historical_discharge"),
-        HDWQ("historical_discharge_wq"),
-        SFD("sinfo_flow_depth"),
-        SFDMM("sinfo_flow_depth_minmax"),
-        SFDD("sinfo_flow_depth_development"),
-        SFDDPY("sinfo_flow_depth_development_peryear"),
-        SC("sinfo_collision"),
-        SFDUR("sinfo_flood_duration"),
-        STKH("sinfo_tkk");
+        FD("fix_derivate_curve"), LS("longitudinal_section"), CS("cross_section"), DLS("discharge_longitudinal_section"), CDC("computed_discharge_curve"), DUC(
+                "duration_curve"), DIC("discharge_curve"), RC("reference_curve"), RCN("reference_curve_normalized"), WD("wdifferences"), BHDY(
+                        "bedheight_difference_height_year"), BDY("bed_difference_year"), FWQC("fix_wq_curve"), FDWC("fix_deltawt_curve"), FLSC(
+                                "fix_longitudinal_section_curve"), FDC("fix_derivate_curve"), EWQ("extreme_wq_curve"), BHM("bedheight_middle"), BLS(
+                                        "bed_longitudinal_section"), SLS("sedimentload_ls"), FV(
+                                                "flow_velocity"), SQA("sq_relation_a"), SQB("sq_relation_b"), W_D("w_differences"), SQC("sq_relation_c"), SQD(
+                                                        "sq_relation_d"), SQE("sq_relation_e"), SQF("sq_relation_f"), HD("historical_discharge"), HDWQ(
+                                                                "historical_discharge_wq"), SFD("sinfo_flow_depth"), SFDMM("sinfo_flow_depth_minmax"), SFDD(
+                                                                        "sinfo_flow_depth_development"), SFDDPY("sinfo_flow_depth_development_peryear"), SC(
+                                                                                "sinfo_collision"), SFDUR("sinfo_flood_duration"), STKH("sinfo_tkk");
 
-        private String chartTypeString;
+        private final String chartTypeString;
 
-        ChartType(String description) {
+        ChartType(final String description) {
             this.chartTypeString = description;
         }
 
@@ -209,44 +133,43 @@
         }
     }
 
-    String AREA                        = "area";
-    String CROSS_SECTION_AREA          = "cross_section.area";
-    String LONGITUDINAL_SECTION_AREA   = "longitudinal_section.area";
+    String AREA = "area";
+    String CROSS_SECTION_AREA = "cross_section.area";
+    String LONGITUDINAL_SECTION_AREA = "longitudinal_section.area";
 
-    String FLOODMAP_WSPLGEN            = "floodmap.wsplgen";
-    String FLOODMAP_BARRIERS           = "floodmap.barriers";
-    String FLOODMAP_USERSHAPE          = "floodmap.usershape";
-    String FLOODMAP_RIVERAXIS          = "floodmap.riveraxis";
+    String FLOODMAP_WSPLGEN = "floodmap.wsplgen";
+    String FLOODMAP_BARRIERS = "floodmap.barriers";
+    String FLOODMAP_USERSHAPE = "floodmap.usershape";
+    String FLOODMAP_RIVERAXIS = "floodmap.riveraxis";
     @Deprecated
-    String FLOODMAP_WMSBACKGROUND      = "floodmap.wmsbackground";
-    String FLOODMAP_KMS                = "floodmap.kms";
-    String FLOODMAP_QPS                = "floodmap.qps";
-    String FLOODMAP_HWS_LINES          = "floodmap.hws_lines";
-    String FLOODMAP_HWS_POINTS         = "floodmap.hws_points";
-    String FLOODMAP_HYDR_BOUNDARY      = "floodmap.hydr_boundaries";
+    String FLOODMAP_WMSBACKGROUND = "floodmap.wmsbackground";
+    String FLOODMAP_KMS = "floodmap.kms";
+    String FLOODMAP_QPS = "floodmap.qps";
+    String FLOODMAP_HWS_LINES = "floodmap.hws_lines";
+    String FLOODMAP_HWS_POINTS = "floodmap.hws_points";
+    String FLOODMAP_HYDR_BOUNDARY = "floodmap.hydr_boundaries";
     String FLOODMAP_HYDR_BOUNDARY_POLY = "floodmap.hydr_boundaries_poly";
-    String FLOODMAP_CATCHMENT          = "floodmap.catchment";
-    String FLOODMAP_FLOODPLAIN         = "floodmap.floodplain";
-    String FLOODMAP_LINES              = "floodmap.lines";
-    String FLOODMAP_BUILDINGS          = "floodmap.buildings";
-    String FLOODMAP_FIXPOINTS          = "floodmap.fixpoints";
-    String FLOODMAP_FLOODMARKS         = "floodmap.floodmarks";
-    String FLOODMAP_FLOODMAPS          = "floodmap.floodmaps";
-    String FLOODMAP_GAUGE_LOCATION     = "floodmap.gauge_location";
-    String FLOODMAP_EXTERNAL_WMS       = "floodmap.externalwms";
-    String FLOODMAP_JETTIES            = "floodmap.jetties";
+    String FLOODMAP_CATCHMENT = "floodmap.catchment";
+    String FLOODMAP_FLOODPLAIN = "floodmap.floodplain";
+    String FLOODMAP_LINES = "floodmap.lines";
+    String FLOODMAP_BUILDINGS = "floodmap.buildings";
+    String FLOODMAP_FIXPOINTS = "floodmap.fixpoints";
+    String FLOODMAP_FLOODMARKS = "floodmap.floodmarks";
+    String FLOODMAP_FLOODMAPS = "floodmap.floodmaps";
+    String FLOODMAP_GAUGE_LOCATION = "floodmap.gauge_location";
+    String FLOODMAP_EXTERNAL_WMS = "floodmap.externalwms";
+    String FLOODMAP_EXTERNAL_WMS_INUNDATIONDUR = "floodmap.externalwms_";
+    String FLOODMAP_JETTIES = "floodmap.jetties";
 
     String DISCHARGE_LONGITUDINAL_W = "discharge_longitudinal_section.w";
     String DISCHARGE_LONGITUDINAL_Q = "discharge_longitudinal_section.q";
-    String DISCHARGE_LONGITUDINAL_Q_INFOLD =
-        "discharge_longitudinal_section.q.infolding";
-    String DISCHARGE_LONGITUDINAL_Q_INFOLD_CUT =
-        "discharge_longitudinal_section.q.cutting";
+    String DISCHARGE_LONGITUDINAL_Q_INFOLD = "discharge_longitudinal_section.q.infolding";
+    String DISCHARGE_LONGITUDINAL_Q_INFOLD_CUT = "discharge_longitudinal_section.q.cutting";
     String DISCHARGE_LONGITUDINAL_C = "discharge_longitudinal_section.c";
 
     String LONGITUDINAL_W = "longitudinal_section.w";
     String LONGITUDINAL_Q = "longitudinal_section.q";
-    String LONGITUDINAL_ANNOTATION   = "longitudinal_section.annotations";
+    String LONGITUDINAL_ANNOTATION = "longitudinal_section.annotations";
     String LONGITUDINAL_MANUALPOINTS = "longitudinal_section.manualpoints";
 
     String W_DIFFERENCES = "w_differences";
@@ -272,17 +195,17 @@
     String MANUALPOINTS = "manualpoints";
     String MANUALLINE = "manualline";
 
-    String QSECTOR        = "qsectors";
+    String QSECTOR = "qsectors";
 
-    String STATIC_DELTA_W    = "other.delta_w";
-    String STATIC_DELTA_W_CMA= "other.delta_w_cma";
-    String STATIC_WQ         = "other.wq";
+    String STATIC_DELTA_W = "other.delta_w";
+    String STATIC_DELTA_W_CMA = "other.delta_w_cma";
+    String STATIC_WQ = "other.wq";
     String STATIC_WQ_ANNOTATIONS = "other.wq.annotations";
-    String STATIC_WKMS       = "other.wkms";
+    String STATIC_WKMS = "other.wkms";
     String STATIC_WKMS_MARKS = "other.wkms.marks";
-    String STATIC_WQKMS      = "other.wqkms";
-    String STATIC_WQKMS_W    = "other.wqkms.w";
-    String STATIC_WQKMS_Q    = "other.wqkms.q";
+    String STATIC_WQKMS = "other.wqkms";
+    String STATIC_WQKMS_W = "other.wqkms.w";
+    String STATIC_WQKMS_Q = "other.wqkms.q";
     String STATIC_WKMS_INTERPOL = "other.wkms.interpol";
     String STATIC_W_INTERPOL = "other.w.interpol";
 
@@ -290,74 +213,57 @@
 
     String CSV = "csv";
     String WST = "wst";
-    String AT  = "at";
+    String AT = "at";
     String PDF = "pdf";
 
     String REPORT = "report";
 
-    String HISTORICAL_DISCHARGE_Q      = "historical_discharge.historicalq";
-    String HISTORICAL_DISCHARGE_Q_DIFF =
-        "historical_discharge.historicalq.diff";
-    String HISTORICAL_DISCHARGE_W      = "historical_discharge.historicalw";
-    String HISTORICAL_DISCHARGE_W_DIFF =
-        "historical_discharge.historicalw.diff";
-    String HISTORICAL_DISCHARGE_WQ_Q   = "historical_discharge.wq.q";
-    String HISTORICAL_DISCHARGE_WQ_W   = "historical_discharge.wq.w";
+    String HISTORICAL_DISCHARGE_Q = "historical_discharge.historicalq";
+    String HISTORICAL_DISCHARGE_Q_DIFF = "historical_discharge.historicalq.diff";
+    String HISTORICAL_DISCHARGE_W = "historical_discharge.historicalw";
+    String HISTORICAL_DISCHARGE_W_DIFF = "historical_discharge.historicalw.diff";
+    String HISTORICAL_DISCHARGE_WQ_Q = "historical_discharge.wq.q";
+    String HISTORICAL_DISCHARGE_WQ_W = "historical_discharge.wq.w";
 
-    String REFERENCE_CURVE            = "reference_curve";
+    String REFERENCE_CURVE = "reference_curve";
     String REFERENCE_CURVE_NORMALIZED = "reference_curve_normalized";
 
-    String FLOW_VELOCITY_MAINCHANNEL           = "flow_velocity.mainchannel";
-    String FLOW_VELOCITY_TOTALCHANNEL          = "flow_velocity.totalchannel";
+    String FLOW_VELOCITY_MAINCHANNEL = "flow_velocity.mainchannel";
+    String FLOW_VELOCITY_TOTALCHANNEL = "flow_velocity.totalchannel";
     /** Also called SHEAR_STRESS. */
-    String FLOW_VELOCITY_TAU                   = "flow_velocity.tau";
-    String FLOW_VELOCITY_MAINCHANNEL_FILTERED  =
-        "flow_velocity.mainchannel.filtered";
-    String FLOW_VELOCITY_TOTALCHANNEL_FILTERED =
-        "flow_velocity.totalchannel.filtered";
-    String FLOW_VELOCITY_TAU_FILTERED          = "flow_velocity.tau.filtered";
-    String FLOW_VELOCITY_ANNOTATION            = "flow_velocity.annotation";
-    String FLOW_VELOCITY_MEASUREMENT           = "flow_velocity.measurement";
-    String FLOW_VELOCITY_DISCHARGE             = "flow_velocity.discharge";
-    String FLOW_VELOCITY_WATERLEVEL            = "flow_velocity.waterlevel";
+    String FLOW_VELOCITY_TAU = "flow_velocity.tau";
+    String FLOW_VELOCITY_MAINCHANNEL_FILTERED = "flow_velocity.mainchannel.filtered";
+    String FLOW_VELOCITY_TOTALCHANNEL_FILTERED = "flow_velocity.totalchannel.filtered";
+    String FLOW_VELOCITY_TAU_FILTERED = "flow_velocity.tau.filtered";
+    String FLOW_VELOCITY_ANNOTATION = "flow_velocity.annotation";
+    String FLOW_VELOCITY_MEASUREMENT = "flow_velocity.measurement";
+    String FLOW_VELOCITY_DISCHARGE = "flow_velocity.discharge";
+    String FLOW_VELOCITY_WATERLEVEL = "flow_velocity.waterlevel";
 
-    String MIDDLE_BED_HEIGHT_SINGLE     = "bedheight_middle.single";
+    String MIDDLE_BED_HEIGHT_SINGLE = "bedheight_middle.single";
     String MIDDLE_BED_HEIGHT_ANNOTATION = "bedheight_middle.annotation";
 
     String BED_QUALITY_DATA_FACET = "bed_longitudinal_section";
-    String BED_QUALITY_POROSITY_TOPLAYER =
-        BED_QUALITY_DATA_FACET + ".porosity.toplayer";
-    String BED_QUALITY_POROSITY_SUBLAYER =
-        BED_QUALITY_DATA_FACET + ".porosity.sublayer";
-    String BED_QUALITY_BED_DIAMETER_TOPLAYER =
-        BED_QUALITY_DATA_FACET + ".diameter.toplayer";
-    String BED_QUALITY_BED_DIAMETER_SUBLAYER =
-        BED_QUALITY_DATA_FACET + ".diameter.sublayer";
-    String BED_QUALITY_SEDIMENT_DENSITY_TOPLAYER =
-        BED_QUALITY_DATA_FACET + ".density.toplayer";
-    String BED_QUALITY_SEDIMENT_DENSITY_SUBLAYER =
-        BED_QUALITY_DATA_FACET + ".density.sublayer";
-    String BED_QUALITY_BEDLOAD_DIAMETER =
-        BED_QUALITY_DATA_FACET + ".diameter.bedload";
-    String BED_DIAMETER_DATA_TOP =
-        BED_QUALITY_DATA_FACET + ".diameter.toplayer.data";
-    String BED_DIAMETER_DATA_SUB =
-        BED_QUALITY_DATA_FACET + ".diameter.sublayer.data";
-    String BEDLOAD_DIAMETER_DATA =
-        BED_QUALITY_DATA_FACET + ".diameter.bedload.data";
+    String BED_QUALITY_POROSITY_TOPLAYER = BED_QUALITY_DATA_FACET + ".porosity.toplayer";
+    String BED_QUALITY_POROSITY_SUBLAYER = BED_QUALITY_DATA_FACET + ".porosity.sublayer";
+    String BED_QUALITY_BED_DIAMETER_TOPLAYER = BED_QUALITY_DATA_FACET + ".diameter.toplayer";
+    String BED_QUALITY_BED_DIAMETER_SUBLAYER = BED_QUALITY_DATA_FACET + ".diameter.sublayer";
+    String BED_QUALITY_SEDIMENT_DENSITY_TOPLAYER = BED_QUALITY_DATA_FACET + ".density.toplayer";
+    String BED_QUALITY_SEDIMENT_DENSITY_SUBLAYER = BED_QUALITY_DATA_FACET + ".density.sublayer";
+    String BED_QUALITY_BEDLOAD_DIAMETER = BED_QUALITY_DATA_FACET + ".diameter.bedload";
+    String BED_DIAMETER_DATA_TOP = BED_QUALITY_DATA_FACET + ".diameter.toplayer.data";
+    String BED_DIAMETER_DATA_SUB = BED_QUALITY_DATA_FACET + ".diameter.sublayer.data";
+    String BEDLOAD_DIAMETER_DATA = BED_QUALITY_DATA_FACET + ".diameter.bedload.data";
     String POROSITY = "porosity";
 
     String BED_DIFFERENCE_YEAR = "bedheight_difference.year";
     String BED_DIFFERENCE_YEAR_FILTERED = "bedheight_difference.year.filtered";
     String BED_DIFFERENCE_HEIGHT_YEAR = "bedheight_difference.height_year";
-    String BED_DIFFERENCE_HEIGHT_YEAR_FILTERED =
-        "bedheight_difference.height_year.filtered";
+    String BED_DIFFERENCE_HEIGHT_YEAR_FILTERED = "bedheight_difference.height_year.filtered";
     String BED_DIFFERENCE_YEAR_HEIGHT1 = "bedheight_difference.year.height1";
     String BED_DIFFERENCE_YEAR_HEIGHT2 = "bedheight_difference.year.height2";
-    String BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED =
-        "bedheight_difference.year.height1.filtered";
-    String BED_DIFFERENCE_YEAR_HEIGHT2_FILTERED =
-        "bedheight_difference.year.height2.filtered";
+    String BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED = "bedheight_difference.year.height1.filtered";
+    String BED_DIFFERENCE_YEAR_HEIGHT2_FILTERED = "bedheight_difference.year.height2.filtered";
 
     String MORPHOLOGIC_WIDTH = "morph-width";
 
@@ -365,88 +271,87 @@
 
     String SQ_OVERVIEW = "sq_overview";
 
-    String SQ_A_CURVE       = "sq_a_curve";
+    String SQ_A_CURVE = "sq_a_curve";
     String SQ_A_MEASUREMENT = "sq_a_measurement";
-    String SQ_A_OUTLIER     = "sq_a_outlier";
+    String SQ_A_OUTLIER = "sq_a_outlier";
     String SQ_A_OUTLIER_CURVE = "sq_a_outlier_curve";
     String SQ_A_OUTLIER_MEASUREMENT = "sq_a_outlier_measurement";
 
-    String SQ_B_CURVE       = "sq_b_curve";
+    String SQ_B_CURVE = "sq_b_curve";
     String SQ_B_MEASUREMENT = "sq_b_measurement";
-    String SQ_B_OUTLIER     = "sq_b_outlier";
-    String SQ_B_OUTLIER_CURVE  = "sq_b_outlier_curve";
-    String SQ_B_OUTLIER_MEASUREMENT  = "sq_b_outlier_measurement";
+    String SQ_B_OUTLIER = "sq_b_outlier";
+    String SQ_B_OUTLIER_CURVE = "sq_b_outlier_curve";
+    String SQ_B_OUTLIER_MEASUREMENT = "sq_b_outlier_measurement";
 
-    String SQ_C_CURVE       = "sq_c_curve";
+    String SQ_C_CURVE = "sq_c_curve";
     String SQ_C_MEASUREMENT = "sq_c_measurement";
-    String SQ_C_OUTLIER     = "sq_c_outlier";
+    String SQ_C_OUTLIER = "sq_c_outlier";
     String SQ_C_OUTLIER_CURVE = "sq_c_outlier_curve";
     String SQ_C_OUTLIER_MEASUREMENT = "sq_c_outlier_measurement";
 
-    String SQ_D_CURVE       = "sq_d_curve";
+    String SQ_D_CURVE = "sq_d_curve";
     String SQ_D_MEASUREMENT = "sq_d_measurement";
-    String SQ_D_OUTLIER     = "sq_d_outlier";
+    String SQ_D_OUTLIER = "sq_d_outlier";
     String SQ_D_OUTLIER_CURVE = "sq_d_outlier_curve";
     String SQ_D_OUTLIER_MEASUREMENT = "sq_d_outlier_measurement";
 
-    String SQ_E_CURVE       = "sq_e_curve";
+    String SQ_E_CURVE = "sq_e_curve";
     String SQ_E_MEASUREMENT = "sq_e_measurement";
-    String SQ_E_OUTLIER     = "sq_e_outlier";
+    String SQ_E_OUTLIER = "sq_e_outlier";
     String SQ_E_OUTLIER_CURVE = "sq_e_outlier_curve";
     String SQ_E_OUTLIER_MEASUREMENT = "sq_e_outlier_curve_measurement";
 
-    String SQ_F_CURVE       = "sq_f_curve";
+    String SQ_F_CURVE = "sq_f_curve";
     String SQ_F_MEASUREMENT = "sq_f_measurement";
-    String SQ_F_OUTLIER     = "sq_f_outlier";
+    String SQ_F_OUTLIER = "sq_f_outlier";
     String SQ_F_OUTLIER_CURVE = "sq_f_outlier_curve";
     String SQ_F_OUTLIER_MEASUREMENT = "sq_f_outlier_measurement";
 
-    String SQ_G_CURVE       = "sq_g_curve";
+    String SQ_G_CURVE = "sq_g_curve";
     String SQ_G_MEASUREMENT = "sq_g_measurement";
-    String SQ_G_OUTLIER     = "sq_g_outlier";
+    String SQ_G_OUTLIER = "sq_g_outlier";
     String SQ_G_OUTLIER_CURVE = "sq_g_outlier_curve";
     String SQ_G_OUTLIER_MEASUREMENT = "sq_g_outlier_measurement";
 
-    String SQ_A_CURVE_OV       = "sq_a_curve_overview";
+    String SQ_A_CURVE_OV = "sq_a_curve_overview";
     String SQ_A_MEASUREMENT_OV = "sq_a_measurement_overview";
-    String SQ_A_OUTLIER_OV     = "sq_a_outlier_overview";
+    String SQ_A_OUTLIER_OV = "sq_a_outlier_overview";
     String SQ_A_OUTLIER_CURVE_OV = "sq_a_outlier_curve_overview";
     String SQ_A_OUTLIER_MEASUREMENT_OV = "sq_a_outlier_measurement_overview";
 
-    String SQ_B_CURVE_OV       = "sq_b_curve_overview";
+    String SQ_B_CURVE_OV = "sq_b_curve_overview";
     String SQ_B_MEASUREMENT_OV = "sq_b_measurement_overview";
-    String SQ_B_OUTLIER_OV     = "sq_b_outlier_overview";
-    String SQ_B_OUTLIER_CURVE_OV  = "sq_b_outlier_curve_overview";
-    String SQ_B_OUTLIER_MEASUREMENT_OV  = "sq_b_outlier_measurement_overview";
+    String SQ_B_OUTLIER_OV = "sq_b_outlier_overview";
+    String SQ_B_OUTLIER_CURVE_OV = "sq_b_outlier_curve_overview";
+    String SQ_B_OUTLIER_MEASUREMENT_OV = "sq_b_outlier_measurement_overview";
 
-    String SQ_C_CURVE_OV       = "sq_c_curve_overview";
+    String SQ_C_CURVE_OV = "sq_c_curve_overview";
     String SQ_C_MEASUREMENT_OV = "sq_c_measurement_overview";
-    String SQ_C_OUTLIER_OV     = "sq_c_outlier_overview";
+    String SQ_C_OUTLIER_OV = "sq_c_outlier_overview";
     String SQ_C_OUTLIER_CURVE_OV = "sq_c_outlier_curve_overview";
     String SQ_C_OUTLIER_MEASUREMENT_OV = "sq_c_outlier_measurement_overview";
 
-    String SQ_D_CURVE_OV       = "sq_d_curve_overview";
+    String SQ_D_CURVE_OV = "sq_d_curve_overview";
     String SQ_D_MEASUREMENT_OV = "sq_d_measurement_overview";
-    String SQ_D_OUTLIER_OV     = "sq_d_outlier_overview";
+    String SQ_D_OUTLIER_OV = "sq_d_outlier_overview";
     String SQ_D_OUTLIER_CURVE_OV = "sq_d_outlier_curve_overview";
     String SQ_D_OUTLIER_MEASUREMENT_OV = "sq_d_outlier_measurement_overview";
 
-    String SQ_E_CURVE_OV       = "sq_e_curve_overview";
+    String SQ_E_CURVE_OV = "sq_e_curve_overview";
     String SQ_E_MEASUREMENT_OV = "sq_e_measurement_overview";
-    String SQ_E_OUTLIER_OV     = "sq_e_outlier_overview";
+    String SQ_E_OUTLIER_OV = "sq_e_outlier_overview";
     String SQ_E_OUTLIER_CURVE_OV = "sq_e_outlier_curve_overview";
-    String SQ_E_OUTLIER_MEASUREMENT_OV =
-        "sq_e_outlier_curve_measurement_overview";
+    String SQ_E_OUTLIER_MEASUREMENT_OV = "sq_e_outlier_curve_measurement_overview";
 
-    String SQ_F_CURVE_OV       = "sq_f_curve_overview";
+    String SQ_F_CURVE_OV = "sq_f_curve_overview";
     String SQ_F_MEASUREMENT_OV = "sq_f_measurement_overview";
-    String SQ_F_OUTLIER_OV     = "sq_f_outlier_overview";
+    String SQ_F_OUTLIER_OV = "sq_f_outlier_overview";
     String SQ_F_OUTLIER_CURVE_OV = "sq_f_outlier_curve_overview";
     String SQ_F_OUTLIER_MEASUREMENT_OV = "sq_f_outlier_measurement_overview";
 
-    String SQ_G_CURVE_OV       = "sq_g_curve_overview";
+    String SQ_G_CURVE_OV = "sq_g_curve_overview";
     String SQ_G_MEASUREMENT_OV = "sq_g_measurement_overview";
-    String SQ_G_OUTLIER_OV     = "sq_g_outlier_overview";
+    String SQ_G_OUTLIER_OV = "sq_g_outlier_overview";
     String SQ_G_OUTLIER_CURVE_OV = "sq_g_outlier_curve_overview";
     String SQ_G_OUTLIER_MEASUREMENT_OV = "sq_g_outlier_measurement_overview";
 
@@ -486,9 +391,9 @@
 
     String STATIC_BEDHEIGHT = "static_bedheight";
 
-    String BEDHEIGHT                = "bedheight";
+    String BEDHEIGHT = "bedheight";
     String BEDHEIGHT_SOUNDING_WIDTH = "bedheight_sounding_width";
-    String BEDHEIGHT_WIDTH          = "bedheight_width";
+    String BEDHEIGHT_WIDTH = "bedheight_width";
 
     String EXTREME_WQ_CURVE = "extreme_wq_curve";
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/CalculationSelectSinfo.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/CalculationSelectSinfo.java	Fri Jun 29 12:46:17 2018 +0200
@@ -11,14 +11,18 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.log4j.Logger;
 import org.dive4elements.artifacts.Artifact;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.artifacts.CallMeta;
 import org.dive4elements.artifacts.common.utils.XMLUtils;
+import org.dive4elements.river.artifacts.model.CollisionHibernateFactory;
 import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.artifacts.sinfo.collision.CollisionAccess;
 import org.dive4elements.river.artifacts.states.DefaultState;
+import org.dive4elements.river.model.sinfo.Collision;
 import org.w3c.dom.Element;
 
 /**
@@ -55,7 +59,19 @@
 
         final SINFOArtifact sinfo = (SINFOArtifact) artifact;
         /* throws an exception if calculation mode is invalid */
-        sinfo.getCalculationMode();
+        final String calcmode = sinfo.getCalculationMode().toString(); // "toString()" is important
+        if (calcmode.equals("sinfo_calc_collision")) {
+
+            final CollisionAccess access = new CollisionAccess((SINFOArtifact) artifact);
+
+            final List<Collision> list = CollisionHibernateFactory.getCollisionsByRiver(access.getRiver());
+
+            if (list.size() == 0) {
+                throw new IllegalArgumentException("error_no_data_for_river");
+            }
+        }
+
         return true;
     }
+
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/CalculationSelectUinfo.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/CalculationSelectUinfo.java	Fri Jun 29 12:46:17 2018 +0200
@@ -61,7 +61,7 @@
 
             final String river = uinfo.getRiver();
             if (!UedauernPropertiesHelper.fileExistsForRiver(river)) {
-                throw new IllegalArgumentException("error_river_inundationdur_file_not_found");
+                throw new IllegalArgumentException("error_no_data_for_river");
             }
         }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationAccess.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationAccess.java	Fri Jun 29 12:46:17 2018 +0200
@@ -51,13 +51,6 @@
         assert (calculationMode == UinfoCalcMode.uinfo_inundation_duration);
     }
 
-    public Double getSedimentHeight() {
-        if (super.getBoolean("use_scenario")) {
-            return super.getDouble("sedimentheight"); // TODO: INPUT Valdiation (nicht hier, sondern im Panel. Erinnerung)
-        }
-        return null;
-    }
-
     public Integer getYear() {
         final int[] years = this.helper.getYears("state.uinfo.year", "singleyear");
         if (years != null) {
@@ -78,7 +71,7 @@
     }
 
     public String getWMSScenarioUrl() {
-        if (super.getBoolean("use_scenario")) {
+        if (getIsUseScenario()) {
             final UedauernPropertiesHelper helper = UedauernPropertiesHelper.getInstance(getRiverName());
             if (this.getYear() != null) {
                 return helper.getScenarioUrlFromYear(this.getYear(), this.getDwspl());
@@ -89,8 +82,8 @@
         return "";
     }
 
-    private Integer getDwspl() {
-        if (super.getBoolean("use_scenario")) {
+    public Integer getDwspl() {
+        if (getIsUseScenario()) {
             return super.getInteger("sedimentheight");
         }
         return null;
@@ -101,4 +94,15 @@
         return super.getString("vegzones");
     }
 
+    public boolean getIsUseScenario() {
+        return super.getBoolean("use_scenario");
+    }
+
+    public Integer[] mittelStartEndYears() {
+        if (getIsUseScenario()) {
+            final UedauernPropertiesHelper helper = UedauernPropertiesHelper.getInstance(getRiverName());
+            return helper.getMittelStartEnd();
+        }
+        return null;
+    }
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java	Fri Jun 29 12:46:17 2018 +0200
@@ -9,19 +9,14 @@
  */
 package org.dive4elements.river.artifacts.uinfo.inundationduration;
 
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.artifacts.access.RiverAccess;
-import org.dive4elements.river.artifacts.common.GeneralResultType;
-import org.dive4elements.river.artifacts.common.ResultRow;
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.CalculationResult;
 import org.dive4elements.river.artifacts.resources.Resources;
-import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
@@ -53,35 +48,34 @@
         final RiverInfo riverInfo = new RiverInfo(river);
         final DoubleRange calcRange = indurax.getRange();
         final String url = indurax.getWMSUrl();
-        final Integer year = indurax.getYear(); // null bei year -> Integer.. evtl ungünstig.. evtl. anders lösen
-        final DoubleRange range = indurax.getRange();
-        final Double sedimentHeight = indurax.getSedimentHeight();
+        final Integer year = indurax.getYear(); // null bei year -> Integer
         final String zonesRaw = indurax.getVegZones();
         final List<VegetationZone> zones = VegetationZone.parse(zonesRaw);
-
-        final InundationDurationCalculationResults results = new InundationDurationCalculationResults(calcModeLabel, user, riverInfo, calcRange);
-
-        final Collection<ResultRow> rows = new ArrayList<>();
-
-        final ResultRow row1 = ResultRow.create(). //
-                putValue(GeneralResultType.station, 88). //
-                putValue(SInfoResultType.discharge, 100). //
-                putValue(SInfoResultType.waterlevel, 2). //
-                putValue(SInfoResultType.gaugeLabel, "Torgau");
+        final String scenarioUrl = indurax.getWMSScenarioUrl();
+        final String scenarioStr = String.valueOf(indurax.getDwspl());
 
-        rows.add(row1);
-
-        final ResultRow row2 = ResultRow.create(). //
-                putValue(SInfoResultType.discharge, 200). //
-                putValue(SInfoResultType.waterlevel, 3). //
-                putValue(SInfoResultType.gaugeLabel, "Zollenspieker");
+        // TODO: add vegetationzone-values as parameter to url and use this url as veg'zone'url
 
-        rows.add(row2);
+        final boolean isUseScenario = indurax.getIsUseScenario();
+        final Integer[] mittelStartEndYears = indurax.mittelStartEndYears();
+        final InundationDurationCalculationResult result = new InundationDurationCalculationResult();
 
-        final InundationDurationCalculationResult result = new InundationDurationCalculationResult("Ergebnis 1", null, rows);
+        final String rangeDuration = year != null ? String.valueOf(year)
+                : new StringBuilder().append(String.valueOf(mittelStartEndYears[0])).append("-").append(mittelStartEndYears[1]).toString();
 
-        results.addResult(result, problems);
+        result.addLayer(Resources.getMsg(this.context.getMeta(), "uinfo.export.url.inundationduration.inundationduration", new Object[] { rangeDuration }), url,
+                true);
+        // TODO: add vegetationzone-values as parameter to url and use this url as veg'zone'url
+        result.addLayer(Resources.getMsg(this.context.getMeta(), "uinfo.export.url.inundationduration.vegetation", new Object[] { rangeDuration }), url, false);
+        if (isUseScenario) {
+            result.addLayer(
+                    Resources.getMsg(this.context.getMeta(), "uinfo.export.url.inundationduration.scenario", new Object[] { rangeDuration, scenarioStr }),
+                    scenarioUrl, true);
+            // TODO: add vegetationzone-values as parameter to url and use this url as veg'zone'url
+            result.addLayer(Resources.getMsg(this.context.getMeta(), "uinfo.export.url.inundationduration.vegetation_scenario",
+                    new Object[] { rangeDuration, scenarioStr }), scenarioUrl, false);
+        }
 
-        return new CalculationResult(results, problems);
+        return new CalculationResult(result, problems);
     }
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResult.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResult.java	Fri Jun 29 12:46:17 2018 +0200
@@ -9,95 +9,48 @@
  */
 package org.dive4elements.river.artifacts.uinfo.inundationduration;
 
+import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Collection;
-
-import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
-import org.dive4elements.river.artifacts.common.ExportContextCSV;
-import org.dive4elements.river.artifacts.common.GeneralResultType;
-import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
-import org.dive4elements.river.artifacts.common.ResultRow;
-import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
-import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
-import org.dive4elements.river.artifacts.sinfo.util.WstInfo;
+import java.util.List;
 
 /**
  * @author Domenico Nardi Tironi
  */
-final class InundationDurationCalculationResult extends AbstractCalculationExportableResult<InundationDurationCalculationResults> {
+final class InundationDurationCalculationResult implements Serializable {
 
     private static final long serialVersionUID = 1L;
-    private static final String JASPER_FILE = "/jasper/templates/uinfo.inundationduration.jrxml";
-
-    public InundationDurationCalculationResult(final String label, final WstInfo wst, final Collection<ResultRow> rows) {
-        super(label, rows);
-    }
-
-    @Override
-    public void writeCSVHeader(final ExportContextCSV exportContextCSV, final InundationDurationCalculationResults results, final RiverInfo river) {
-
-        final Collection<String> header = new ArrayList<>(11);
-
-        header.add(exportContextCSV.formatCsvHeader(GeneralResultType.station));
-        header.add(exportContextCSV.msgUnitCSV(SInfoResultType.flowdepth));
 
-        header.add(exportContextCSV.msgUnitCSV(SInfoResultType.waterlevel, river.getWstUnit()));
-        header.add(exportContextCSV.msgUnitCSV(SInfoResultType.discharge));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.waterlevelLabel));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.gaugeLabel));
-        header.add(exportContextCSV.msgUnitCSV(SInfoResultType.meanBedHeight, river.getWstUnit()));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.soundingLabel));
-        header.add(exportContextCSV.formatCsvHeader(SInfoResultType.location));
+    private final List<WmsLayer> layers = new ArrayList<>();
 
-        exportContextCSV.writeCSVLine(header.toArray(new String[header.size()]));
+    public final static class WmsLayer {
+        private final String label;
+        private final String url;
+        private final boolean showLayerLink;
 
-    }
+        public WmsLayer(final String label, final String url, final boolean showLayerLink) {
+            this.label = label;
+            this.url = url;
+            this.showLayerLink = showLayerLink;
+        }
 
-    @Override
-    protected void writeCSVResultMetadata(final ExportContextCSV exportContextCSV, final InundationDurationCalculationResults results) {
-        // no Result metadata so far
+        public String getLabel() {
+            return this.label;
+        }
+
+        public String getUrl() {
+            return this.url;
+        }
+
+        public boolean isShowLayerLink() {
+            return this.showLayerLink;
+        }
     }
 
-    @Override
-    protected String[] formatCSVRow(final ExportContextCSV exportContextCSV, final InundationDurationCalculationResults results, final ResultRow row) {
-        return formatRow(exportContextCSV, results, row);
-    }
-
-    @Override
-    protected String[] formatPDFRow(final ExportContextCSV exportContextPDF, final InundationDurationCalculationResults results, final ResultRow row) {
-
-        return formatRow(exportContextPDF, results, row);
-    }
-
-    @Override
-    protected String getJasperFile() {
-
-        return JASPER_FILE;
+    public void addLayer(final String label, final String url, final boolean showLayerLink) {
+        this.layers.add(new WmsLayer(label, url, showLayerLink));
     }
 
-    @Override
-    protected void addJRTableHeader(final ExportContextCSV exportContextPDF, final MetaAndTableJRDataSource source,
-            final InundationDurationCalculationResults results) {
-
-        exportContextPDF.addJRMetadata(source, "station_header", GeneralResultType.station);
+    public List<WmsLayer> getLayers() {
+        return this.layers;
     }
-
-    protected String[] formatRow(final ExportContextCSV context, final InundationDurationCalculationResults results, final ResultRow row) {
-
-        final Collection<String> lines = new ArrayList<>(11);
-
-        lines.add(context.formatRowValue(row, GeneralResultType.station));
-        lines.add(context.formatRowValue(row, SInfoResultType.flowdepth));
-
-        lines.add(context.formatRowValue(row, SInfoResultType.waterlevel));
-        lines.add(context.formatRowValue(row, SInfoResultType.discharge));
-        lines.add(context.formatRowValue(row, SInfoResultType.waterlevelLabel));
-        lines.add(context.formatRowValue(row, SInfoResultType.gaugeLabel));
-        lines.add(context.formatRowValue(row, SInfoResultType.meanBedHeight));
-        lines.add(context.formatRowValue(row, SInfoResultType.soundingLabel));
-        lines.add(context.formatRowValue(row, SInfoResultType.location));
-
-        return lines.toArray(new String[lines.size()]);
-    }
-
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculationResults.java	Thu Jun 28 19:13:14 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
- * Software engineering by
- *  Björnsen Beratende Ingenieure GmbH
- *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
- *
- * This file is Free Software under the GNU AGPL (>=v3)
- * and comes with ABSOLUTELY NO WARRANTY! Check out the
- * documentation coming with Dive4Elements River for details.
- */
-package org.dive4elements.river.artifacts.uinfo.inundationduration;
-
-import org.apache.commons.lang.math.DoubleRange;
-import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
-import org.dive4elements.river.artifacts.common.AbstractCalculationResults;
-import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
-
-/**
- * @author Domenico Nardi Tironi
- *
- */
-final class InundationDurationCalculationResults extends AbstractCalculationResults<AbstractCalculationExportableResult<InundationDurationCalculationResults>> {
-
-    private static final long serialVersionUID = 1L;
-
-    public InundationDurationCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange) {
-        super(calcModeLabel, user, river, calcRange);
-    }
-}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java	Thu Jun 28 19:13:14 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
-* Software engineering by
-*  Björnsen Beratende Ingenieure GmbH
-*  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
-*
-* This file is Free Software under the GNU AGPL (>=v3)
-* and comes with ABSOLUTELY NO WARRANTY! Check out the
-* documentation coming with Dive4Elements River for details.
-*/
-package org.dive4elements.river.artifacts.uinfo.inundationduration;
-
-import java.io.OutputStream;
-
-import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
-import org.dive4elements.river.artifacts.common.AbstractCommonExporter;
-import org.dive4elements.river.artifacts.common.ExportContextCSV;
-import org.dive4elements.river.artifacts.common.I18NStrings;
-import org.dive4elements.river.artifacts.common.JasperReporter;
-import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
-import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
-
-import au.com.bytecode.opencsv.CSVWriter;
-import net.sf.jasperreports.engine.JRException;
-
-/**
- * @author Domenico Nardi Tironi
- *
- */
-public class InundationDurationExporter extends AbstractCommonExporter<InundationDurationCalculationResults> {
-
-    @Override
-    protected void doWritePdf(final OutputStream out, final InundationDurationCalculationResults results) {
-        // TODO: Move to super
-        try {
-            final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, null);
-
-            final JasperReporter reporter = new JasperReporter();
-
-            for (final AbstractCalculationExportableResult<InundationDurationCalculationResults> result : results.getResults()) {
-                final MetaAndTableJRDataSource source = new MetaAndTableJRDataSource();
-                getHelper().addJRMetaDataUSINFO(source, results);
-
-                result.addReport(exportContextCSV, results, reporter, source);
-            }
-
-            reporter.exportPDF(out);
-        }
-        catch (final JRException je) {
-            getLog().warn("Error generating PDF Report!", je);
-        }
-    }
-
-    @Override
-    protected void doWriteCSVData(final CSVWriter writer, final InundationDurationCalculationResults results) {
-        // TODO: Diesen Ablauf in super? -> leichte abweichung
-
-        // TODO: move results into context?
-        final ExportContextCSV exportContextCSV = new ExportContextCSV(this.context, writer);
-
-        getLog().info("writeCSVData");
-
-        final RiverInfo river = results.getRiver();
-
-        /* write as csv */
-        exportContextCSV.writeCSVGlobalMetadataDefaults(results); // ggf auslagern innerhalb dieser Klasse
-        exportContextCSV.writeCSVMetaEntry(I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit());
-        // writer.writeNext(new String[] { "" }); // break line HERE to avoid redundance
-
-        final Class<?> lastResultType = null;
-
-        for (final AbstractCalculationExportableResult<InundationDurationCalculationResults> result : results.getResults()) {
-
-            final Class<?> resultType = result.getClass();
-            if (lastResultType == null || lastResultType != resultType) {
-                exportContextCSV.writeBlankLine();
-                result.writeCSVHeader(exportContextCSV, results, river);
-                exportContextCSV.writeBlankLine();
-            } else
-                exportContextCSV.writeCSVLine(new String[] { "#" });
-
-            result.writeCsv(exportContextCSV, results);
-        }
-
-    }
-}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationState.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationState.java	Fri Jun 29 12:46:17 2018 +0200
@@ -16,14 +16,14 @@
 import org.dive4elements.river.artifacts.ChartArtifact;
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.MapArtifact.MapState;
-import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.CalculationResult;
 import org.dive4elements.river.artifacts.model.DataFacet;
 import org.dive4elements.river.artifacts.model.EmptyFacet;
-import org.dive4elements.river.artifacts.model.FacetTypes;
 import org.dive4elements.river.artifacts.model.ReportFacet;
+import org.dive4elements.river.artifacts.model.map.WMSLayerFacet;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
+import org.dive4elements.river.artifacts.uinfo.inundationduration.InundationDurationCalculationResult.WmsLayer;
 
 /**
  * @author Domenico Nardi Tironi
@@ -35,6 +35,8 @@
 
     private static final long serialVersionUID = 1L;
 
+    private static final String LABEL_URL_SEPARATOR = ";";// always sync with client (ExportPanel)
+
     /**
      * From this state can only be continued trivially.
      */
@@ -51,7 +53,7 @@
             return null;
         }
 
-        return compute((UINFOArtifact) artifact, context, hash, facets, old);
+        return compute((UINFOArtifact) artifact, context, ComputeType.FEED, hash, facets, old);
     }
 
     @Override
@@ -64,7 +66,8 @@
         if (facets != null)
             super.computeAdvance(artifact, hash, context, facets, old);
 
-        return compute((UINFOArtifact) artifact, context, hash, facets, old);
+        return compute((UINFOArtifact) artifact, context, ComputeType.ADVANCE, hash, facets, old);
+
     }
 
     /**
@@ -73,27 +76,43 @@
      * @param old
      *            Object that was cached.
      */
-    private Object compute(final UINFOArtifact sinfo, final CallContext context, final String hash, final List<Facet> facets, final Object old) {
+    private Object compute(final UINFOArtifact sinfo, final CallContext context, final ComputeType type, final String hash, final List<Facet> facets,
+            final Object old) {
 
         final CalculationResult res = doCompute(sinfo, context, old);
 
         if (facets == null)
             return res;
 
-        final InundationDurationCalculationResults results = (InundationDurationCalculationResults) res.getData();
-
-        final List<AbstractCalculationExportableResult<InundationDurationCalculationResults>> resultList = results.getResults();
+        final InundationDurationCalculationResult result = (InundationDurationCalculationResult) res.getData();
+        final List<WmsLayer> layers = result.getLayers();
 
-        if (!resultList.isEmpty()) {
-            final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id);
-            final Facet pdf = new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, this.id);
+        int index = 1; // 1 because super.computeAdvance adds the river theme with index 0
+        for (final WmsLayer layer : layers) {
 
-            facets.add(csv);
-            facets.add(pdf);
+            final String label = layer.getLabel();
+            final String url = layer.getUrl();
+
+            final WMSLayerFacet wmsFacet = new WMSLayerFacet(index, FLOODMAP_EXTERNAL_WMS_INUNDATIONDUR + index, label, type, getID(), hash, url);
+            facets.add(wmsFacet);
+
+            wmsFacet.addLayer("OSM-WMS-Dienst");
+
+            // wmsFacet.setExtent(getExtent(false));
+            // wmsFacet.setOriginalExtent(getExtent(true));
+            wmsFacet.setSrid(getSrid());
+
+            if (layer.isShowLayerLink())
+                facets.add(new DataFacet("wms_url", label + LABEL_URL_SEPARATOR + url, ComputeType.ADVANCE, hash, this.id));
+
+            index++; // because super.computeAdvance adds the river theme with index 0
         }
 
+        // tODO: create layer links: filter by "showLayerLink"
+
+        // tODO: create layer links: filter by "showLayerLink"
+
         final Calculation report = res.getReport();
-
         if (report.hasProblems())
             facets.add(new ReportFacet(ComputeType.ADVANCE, hash, this.id));
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/UedauernPropertiesHelper.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/UedauernPropertiesHelper.java	Fri Jun 29 12:46:17 2018 +0200
@@ -74,7 +74,7 @@
         return this.properties;
     }
 
-    private final Integer[] getMittelStartEnd() {
+    final Integer[] getMittelStartEnd() {
         if (this.mittelStartEnde == null) {
             final Integer mittel_start = Integer.valueOf(getProperties().get("mittel_start").toString());
             final Integer mittel_ende = Integer.valueOf(getProperties().get("mittel_ende").toString());
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/YearChoice.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/YearChoice.java	Fri Jun 29 12:46:17 2018 +0200
@@ -25,14 +25,14 @@
     protected LinkedHashMap<String, String> makeEntries(final CallMeta meta, final Artifact artifact) {
         // in helper-klasse; dann hier label lazy loaden
         final LinkedHashMap<String, String> entries = new LinkedHashMap<>();
-
-        final InundationDurationAccess access = new InundationDurationAccess((UINFOArtifact) artifact);
+        if (artifact != null) {// necessary; otherwise crashes randomly when reloading old calculations
+            final InundationDurationAccess access = new InundationDurationAccess((UINFOArtifact) artifact);
 
-        final UedauernPropertiesHelper helper = UedauernPropertiesHelper.getInstance(access.getRiverName());
-        final LinkedHashMap<String, String> extras = helper.getExtraLayers(meta);
-        entries.put("state.uinfo.year", null);
-        entries.putAll(extras);
-
+            final UedauernPropertiesHelper helper = UedauernPropertiesHelper.getInstance(access.getRiverName());
+            final LinkedHashMap<String, String> extras = helper.getExtraLayers(meta);
+            entries.put("state.uinfo.year", null);
+            entries.putAll(extras);
+        }
         return entries;
     }
 
--- a/artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/AbstractExporter.java	Fri Jun 29 12:46:17 2018 +0200
@@ -305,6 +305,10 @@
         final char quote = '"';
         final char escape = '\\';
 
+        // Write BOM so excel is happy
+        final byte[] BOM = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
+        this.out.write(BOM);
+
         final CSVWriter writer = new CSVWriter(new OutputStreamWriter(this.out, DEFAULT_CSV_CHARSET), DEFAULT_CSV_SEPARATOR, quote, escape, "\r\n");
 
         writeCSVData(writer);
--- a/artifacts/src/main/java/org/dive4elements/river/exports/ChartExportHelper.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/ChartExportHelper.java	Fri Jun 29 12:46:17 2018 +0200
@@ -316,9 +316,10 @@
         log.debug("export chart as CSV");
         
         try {
-// FIXME: decide: to BOM or not to BOM            
-//            final byte[] BOM = new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF};
-//            out.write(BOM);
+           
+            // Write BOM so excel is happy
+            final byte[] BOM = new byte[] {(byte)0xEF, (byte)0xBB, (byte)0xBF};
+            out.write(BOM);
             
             final CSVWriter writer = new CSVWriter(
                 new OutputStreamWriter(
--- a/artifacts/src/main/resources/messages.properties	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/resources/messages.properties	Fri Jun 29 12:46:17 2018 +0200
@@ -1036,8 +1036,8 @@
 sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung
 sinfo.export.pdf.header.flowdepth.development = Flie\u00dftiefen-entwicklung
 sinfo.export.csv.header.flowdepth.development.per.year = Flie\u00dftiefenent-wicklung pro Jahr
-sinfo.export.csv.header.waterlevel.difference = \u0394WSPL 
-sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH 
+sinfo.export.csv.header.waterlevel.difference = \u0394WSPL
+sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH
 sinfo.export.csv.header.flowdepth.current = Flie\u00dftiefe h-aktuell
 sinfo.export.csv.header.flowdepth.historical = Flie\u00dftiefe h-historisch
 
@@ -1095,6 +1095,10 @@
 uinfo.export.csv.meta.header.veg.name = Vegetationszonen
 uinfo.export.csv.meta.header.veg.dauervon = \u00dcberflutungsdauer von [d/a]
 uinfo.export.csv.meta.header.veg.dauerbis = \u00dcberflutungsdauer bis [d/a]
+uinfo.export.url.inundationduration.inundationduration = \u00dcberflutungsdauer ({0})
+uinfo.export.url.inundationduration.vegetation = Vegetationszonen ({0})
+uinfo.export.url.inundationduration.vegetation_scenario= Vegetationszonen Szenario (Zeitraum: {0}, Szenario: {1})
+uinfo.export.url.inundationduration.scenario = \u00dcberflutungsdauer Szenario (Zeitraum: {0}, Szenario: {1})
 
 predefineddepthevol.total.title = Gesamt: {0}
 predefineddepthevol.peryear.title = J\u00e4hrlich: {0}
@@ -1108,8 +1112,8 @@
 sinfo.export.csv.header.infrastructure.height = Infrastrukturh\u00f6he
 infrastructure.height.title = Geod. H\u00f6he 
 
-sinfo.export.csv.title.collision.detail = Detail View
-sinfo.export.csv.title.collison.overview = Overview
+sinfo.export.csv.title.collision.detail = Abfluss/Abflusszustand
+sinfo.export.csv.title.collison.overview = H\u00e4ufigkeiten
 sinfo.export.csv.header.collision.count = Anzahl der Grundber\u00fchrungen
 collision.count.title = Grundber\u00fchrungen {0}
 chart.collision_count.section.yaxis.label = H\u00e4ufigkeit
--- a/artifacts/src/main/resources/messages_de.properties	Thu Jun 28 19:13:14 2018 +0200
+++ b/artifacts/src/main/resources/messages_de.properties	Fri Jun 29 12:46:17 2018 +0200
@@ -1034,10 +1034,10 @@
 sinfo.export.csv.header.channel.width = Sollbreite Fahrrinne
 sinfo.export.csv.header.channel.depth = Solltiefe Fahrrinne
 sinfo.export.pdf.header.flowdepth.development = Flie\u00dftiefen-entwicklung
-sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung																			
+sinfo.export.csv.header.flowdepth.development = Flie\u00dftiefenentwicklung
 sinfo.export.csv.header.flowdepth.development.per.year = Flie\u00dftiefenent-wicklung pro Jahr
-sinfo.export.csv.header.waterlevel.difference = \u0394WSPL 
-sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH 
+sinfo.export.csv.header.waterlevel.difference = \u0394WSPL
+sinfo.export.csv.header.mean_bed_height.difference = \u0394MSH
 sinfo.export.csv.header.flowdepth.current = Flie\u00dftiefe h-aktuell
 sinfo.export.csv.header.flowdepth.historical = Flie\u00dftiefe h-historisch
 
@@ -1095,6 +1095,10 @@
 uinfo.export.csv.meta.header.veg.name = Vegetationszonen
 uinfo.export.csv.meta.header.veg.dauervon = \u00dcberflutungsdauer von [d/a]
 uinfo.export.csv.meta.header.veg.dauerbis = \u00dcberflutungsdauer bis [d/a]
+uinfo.export.url.inundationduration.inundationduration = \u00dcberflutungsdauer ({0})
+uinfo.export.url.inundationduration.vegetation = Vegetationszonen ({0})
+uinfo.export.url.inundationduration.vegetation_scenario= Vegetationszonen Szenario (Zeitraum: {0}, Szenario: {1})
+uinfo.export.url.inundationduration.scenario = \u00dcberflutungsdauer Szenario (Zeitraum: {0}, Szenario: {1})
 
 predefineddepthevol.total.title = Gesamt: {0}
 predefineddepthevol.peryear.title = J\u00e4hrlich: {0}
@@ -1108,8 +1112,8 @@
 sinfo.export.csv.header.infrastructure.height = Infrastrukturh\u00f6he
 infrastructure.height.title = Geod. H\u00f6he 
 
-sinfo.export.csv.title.collision.detail = Detailansicht
-sinfo.export.csv.title.collison.overview = \u00dcbersicht
+sinfo.export.csv.title.collision.detail = Abfluss/Abflusszustand
+sinfo.export.csv.title.collison.overview = H\u00e4ufigkeiten
 sinfo.export.csv.header.collision.count = Anzahl der Grundber\u00fchrungen
 collision.count.title = Grundber\u00fchrungen {0}
 chart.collision_count.section.yaxis.label = H\u00e4ufigkeit
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java	Fri Jun 29 12:46:17 2018 +0200
@@ -1537,7 +1537,9 @@
 
     String waterlevel_ground_state();
 
-    String error_river_inundationdur_file_not_found();
+    String error_no_data_for_river();
 
     String sinfo_flood_duration();
+
+    String sinfo_collision_export();
 }
\ No newline at end of file
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Thu Jun 28 19:13:14 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Fri Jun 29 12:46:17 2018 +0200
@@ -324,7 +324,7 @@
 ele_window_save_error = Error while saving elevations.
 ele_window_geometry_error = The geometry is not supported:
 
-error_river_inundationdur_file_not_found = F\u00fcr das gew\u00e4hlte Gew\u00e4sser liegen keine Daten vor.
+error_no_data_for_river = F\u00fcr das gew\u00e4hlte Gew\u00e4sser liegen keine Daten vor.
 unexpected_exception = There occured an unexpected exception
 error_years_wrong = The second year needs to be bigger than the first year.
 error_read_minmax_values = Error while reading min/max values for the location input.
@@ -760,6 +760,7 @@
 no_data_sediment_difference = Invalid value: $1
 
 sinfo = S-INFO
+sinfo_collision_export = Grundber\u00fchrungen Export
 sinfo_flowdepth_export = Flie\u00dftiefen Export
 sinfo_flowdepth_report = Flie\u00dftiefen Bericht
 sinfo_flow_depth = Flie\u00dftiefen
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Thu Jun 28 19:13:14 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Fri Jun 29 12:46:17 2018 +0200
@@ -324,7 +324,7 @@
 ele_window_save_error = Fehler beim Speichern der H\u00f6hen.
 ele_window_geometry_error = Die Geometrie wird nicht unterst\u00fctzt:
 
-error_river_inundationdur_file_not_found = F\u00fcr das gew\u00e4hlte Gew\u00e4sser liegen keine Daten vor.
+error_no_data_for_river = F\u00fcr das gew\u00e4hlte Gew\u00e4sser liegen keine Daten vor.
 unexpected_exception = Ein unerwarteter Fehler ist aufgetreten
 error_years_wrong = Das zweite Jahr muss gr\u00f6\u00dfer als das erste sein.
 error_read_minmax_values = Fehler beim Lesen der min/max Werte. Es kann keine Validierung der eingegebenen Strecke durchgef\u00fchrt werden.
@@ -760,6 +760,7 @@
 no_data_sediment_difference = Der Wert $1 ist ung\u00fcltig.
 
 sinfo = S-INFO
+sinfo_collision_export = Grundber\u00fchrungen Export
 sinfo_flowdepth_export = Flie\u00dftiefen Export
 sinfo_flowdepth_report = Flie\u00dftiefen Bericht
 sinfo_flow_depth = Flie\u00dftiefen
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ExportPanel.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ExportPanel.java	Fri Jun 29 12:46:17 2018 +0200
@@ -8,22 +8,25 @@
 
 package org.dive4elements.river.client.client.ui;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.MissingResourceException;
 
-import com.google.gwt.core.client.GWT;
-
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.layout.HLayout;
-import com.smartgwt.client.widgets.layout.VLayout;
-
+import org.dive4elements.river.client.client.Config;
+import org.dive4elements.river.client.client.FLYSConstants;
 import org.dive4elements.river.client.shared.model.Collection;
 import org.dive4elements.river.client.shared.model.ExportMode;
 import org.dive4elements.river.client.shared.model.Facet;
-import org.dive4elements.river.client.client.Config;
-import org.dive4elements.river.client.client.FLYSConstants;
 
+import com.google.gwt.core.client.GWT;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.TextAreaItem;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
 
 /**
  * A panel that displays an download icon for all available export modes of a
@@ -33,34 +36,82 @@
  */
 public class ExportPanel extends VLayout {
 
-    /** The message class that provides i18n strings.*/
+    private static final String LABEL_URL_SEPARATOR = ";";// always sync with server (InundationDurationState)
+    /** The message class that provides i18n strings. */
     protected FLYSConstants MSG = GWT.create(FLYSConstants.class);
 
-    protected Collection       c;
+    protected Collection c;
     protected List<ExportMode> exports;
 
-    /** This layout will store a list of available export types.*/
+    /** This layout will store a list of available export types. */
     protected HLayout container;
 
-
-    public ExportPanel(Collection c, List<ExportMode> exports) {
+    public ExportPanel(final Collection c, final List<ExportMode> exports) {
         super();
 
-        this.c         = c;
-        this.exports   = exports;
+        this.c = c;
+        this.exports = exports;
         this.container = new HLayout();
 
-        Label title = new Label(MSG.dataexport());
+        final Label title = new Label(this.MSG.dataexport());
         title.setHeight(15);
         title.setStyleName("fontNormalSmallUnderlined");
 
         addMember(title);
         addMember(createExportItems());
-
+        addMember(createVlayoutExportItems());
         setHeight(45);
         setMembersMargin(5);
     }
 
+    private VLayout createVlayoutExportItems() {
+        final VLayout layout = new VLayout();
+        final DynamicForm form1 = new DynamicForm();
+        form1.setColWidths("10%");
+        form1.setWidth(400);
+        form1.setAlign(Alignment.LEFT);
+        final List<FormItem> items = new ArrayList<FormItem>();
+        for (final ExportMode mode : this.exports) {
+            final String name = mode.getName();
+            final List<Facet> facets = mode.getFacets();
+
+            for (int i = 0; i < facets.size(); i++) {
+                final Facet facet = facets.get(i);
+                final String facetName = facet.getName();
+
+                if (!facetName.equals("wms_url"))
+                    continue;
+                if ("wms_url".equals(facetName))
+                    items.add(createUrlLine(facet.getDescription(), i));
+            }
+        }
+        form1.setFields(items.toArray(new FormItem[items.size()]));
+        layout.addMember(form1);
+        return layout;
+    }
+
+    private FormItem createUrlLine(final String labelAndUrl, final int count) {
+
+        final String[] labelAndurlSplit = labelAndUrl.split(LABEL_URL_SEPARATOR);
+        if (labelAndurlSplit.length == 2) {
+
+            final TextAreaItem label = new TextAreaItem();
+            label.setTitle(labelAndurlSplit[0]);
+
+            label.setWrapTitle(true);
+            label.setTitleColSpan(3);
+            label.setColSpan(7);
+            label.setWidth(250);
+
+            label.setTitleAlign(Alignment.LEFT);
+
+            label.setValue(labelAndurlSplit[1]);
+            label.setCanEdit(false);
+
+            return label;
+        }
+        return null;
+    }
 
     /**
      * This method is used to create an item (created by createExportButton) for
@@ -69,84 +120,80 @@
      * @return a horizontal list of buttons.
      */
     protected HLayout createExportItems() {
-        HLayout layout = new HLayout();
+        final HLayout layout = new HLayout();
 
-        for (ExportMode mode: exports) {
-            String      name   = mode.getName();
-            List<Facet> facets = mode.getFacets();
+        for (final ExportMode mode : this.exports) {
+            final String name = mode.getName();
+            final List<Facet> facets = mode.getFacets();
 
-            for (Facet facet: facets) {
-                if (name.equals("fix_wq_curve_at_export")) {
+            for (final Facet facet : facets) {
+                final String facetName = facet.getName();
+
+                if (name.equals("fix_wq_curve_at_export"))
                     continue;
-                }
+
                 String filename = name;
-                if (name.equals("computed_dischargecurve_at_export")) {
+                if (name.equals("computed_dischargecurve_at_export"))
                     filename = "dischargecurve";
-                }
-                layout.addMember(createExportButton(
-                    name,
-                    facet.getName(),
-                    filename));
+
+                if ("wms_url".equals(facetName))
+                    continue;
+
+                layout.addMember(createExportButton(name, facetName, filename));
             }
         }
 
         return layout;
     }
 
-
     /**
      * This method is used to create a button (with click handler) for a
      * concrete export mode / type.
      *
-     * @param name The name of the export.
-     * @param facet The name of the export type (e.g. CSV, WST).
+     * @param name
+     *            The name of the export.
+     * @param facet
+     *            The name of the export type (e.g. CSV, WST).
      *
      * @return an image with click handler.
      */
-    protected Canvas createExportButton(
-        String name,
-        String facet,
-        String filename
-    ) {
-        String url  = getExportUrl(name, facet, filename);
+    protected Canvas createExportButton(final String name, final String facet, final String filename) {
+        String url = getExportUrl(name, facet, filename);
         String imgUrl = GWT.getHostPageBaseURL();
         if (facet.equals("pdf")) {
-            imgUrl += MSG.downloadPDF();
-        }
-        else if (facet.equals("at")) {
-            imgUrl += MSG.downloadAT();
-        }
-        else if (facet.equals("wst")) {
-            imgUrl += MSG.downloadWST();
+            imgUrl += this.MSG.downloadPDF();
+        } else if (facet.equals("at")) {
+            imgUrl += this.MSG.downloadAT();
+        } else if (facet.equals("wst")) {
+            imgUrl += this.MSG.downloadWST();
+        } else if (facet.equals("csv")) {
+            url += "&encoding=UTF-8";
+            imgUrl += this.MSG.downloadCSV();
+        } else {
+            imgUrl += this.MSG.imageSave();
         }
-        else  if (facet.equals("csv")) {
-            url += "&encoding=windows-1252";
-            imgUrl += MSG.downloadCSV();
-        }
-        else {
-            imgUrl += MSG.imageSave();
-        }
-        ImgLink link = new ImgLink(imgUrl, url, 30, 30);
+        final ImgLink link = new ImgLink(imgUrl, url, 30, 30);
         link.setTooltip(getTooltipText(name, facet));
 
         return link;
     }
 
-
     /**
      * Creates the URL used to trigger an export.
      *
-     * @param name The name of the export.
-     * @param facet The name of the export type (e.g. CSV, WST).
+     * @param name
+     *            The name of the export.
+     * @param facet
+     *            The name of the export type (e.g. CSV, WST).
      *
      * @return the export URL.
      */
-    protected String getExportUrl(String name, String facet, String filename) {
-        Config config = Config.getInstance();
+    protected String getExportUrl(final String name, final String facet, final String filename) {
+        final Config config = Config.getInstance();
 
         String url = GWT.getModuleBaseURL();
         url += "export";
-        url += "?uuid=" + c.identifier();
+        url += "?uuid=" + this.c.identifier();
         url += "&name=" + filename;
         url += "&mode=" + name;
         url += "&type=" + facet;
@@ -156,20 +203,21 @@
         return url;
     }
 
-
     /**
      * Creates a text used as tooltip for a specific export and type.
      *
-     * @param name The name of the export.
-     * @param facet The name of the export type (e.g. CSV, WST).
+     * @param name
+     *            The name of the export.
+     * @param facet
+     *            The name of the export type (e.g. CSV, WST).
      *
      * @return a tooltip text.
      */
-    protected String getTooltipText(String name, String facet) {
+    protected String getTooltipText(final String name, final String facet) {
         try {
-            return MSG.getString(name) + " | " + MSG.getString(facet);
+            return this.MSG.getString(name) + " | " + this.MSG.getString(facet);
         }
-        catch (MissingResourceException mre) {
+        catch (final MissingResourceException mre) {
             return name + " | " + facet;
         }
     }
--- a/gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java	Thu Jun 28 19:13:14 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/CSVExportServiceImpl.java	Fri Jun 29 12:46:17 2018 +0200
@@ -8,83 +8,68 @@
 
 package org.dive4elements.river.client.server;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
 import java.util.ArrayList;
 import java.util.List;
 
-import java.io.Reader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.IOException;
-
+import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
+import org.dive4elements.artifacts.common.utils.XMLUtils;
+import org.dive4elements.artifacts.httpclient.http.HttpClient;
+import org.dive4elements.artifacts.httpclient.http.HttpClientImpl;
+import org.dive4elements.river.client.client.services.CSVExportService;
+import org.dive4elements.river.client.shared.exceptions.ServerException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-import org.apache.log4j.Logger;
-
 import com.google.gwt.user.server.rpc.RemoteServiceServlet;
 
 import au.com.bytecode.opencsv.CSVReader;
 
-import org.dive4elements.artifacts.common.ArtifactNamespaceContext;
-import org.dive4elements.artifacts.common.utils.XMLUtils;
-
-import org.dive4elements.artifacts.httpclient.http.HttpClient;
-import org.dive4elements.artifacts.httpclient.http.HttpClientImpl;
-
-import org.dive4elements.river.client.shared.exceptions.ServerException;
-import org.dive4elements.river.client.client.services.CSVExportService;
-
-
 /**
  * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
  */
-public class CSVExportServiceImpl
-extends      RemoteServiceServlet
-implements   CSVExportService
-{
-    private static final Logger log =
-        Logger.getLogger(CSVExportServiceImpl.class);
-
+public class CSVExportServiceImpl extends RemoteServiceServlet implements CSVExportService {
+    private static final Logger log = Logger.getLogger(CSVExportServiceImpl.class);
 
-    public static final String ERROR_NO_EXPORT_FOUND =
-        "error_no_export_found";
+    public static final String ERROR_NO_EXPORT_FOUND = "error_no_export_found";
 
-    public List<String[]> getCSV(
-        String locale,
-        String uuid,
-        String name)
-    throws ServerException
-    {
+    @Override
+    public List<String[]> getCSV(final String locale, final String uuid, final String name) throws ServerException {
         log.info("CSVExportServiceImpl.getCSV");
 
-        String url  = getServletContext().getInitParameter("server-url");
-
-        Document requestDoc = XMLUtils.newDocument();
+        final String url = getServletContext().getInitParameter("server-url");
 
-        XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
-            requestDoc,
-            ArtifactNamespaceContext.NAMESPACE_URI,
-            ArtifactNamespaceContext.NAMESPACE_PREFIX);
+        final Document requestDoc = XMLUtils.newDocument();
 
-        Element action = ec.create("action");
+        final XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(requestDoc, ArtifactNamespaceContext.NAMESPACE_URI,
+                ArtifactNamespaceContext.NAMESPACE_PREFIX);
+
+        final Element action = ec.create("action");
         ec.addAttr(action, "type", "csv", true);
         ec.addAttr(action, "name", name, true);
 
         requestDoc.appendChild(action);
 
-        HttpClient client = new HttpClientImpl(url, locale);
+        final HttpClient client = new HttpClientImpl(url, locale);
 
         try {
-            InputStream in = client.collectionOut(requestDoc, uuid, "export");
-            Reader reader       = new InputStreamReader (in, "UTF-8");
-            CSVReader csvReader = new CSVReader (reader, ';');
+            final InputStream in = client.collectionOut(requestDoc, uuid, "export");
+            final Reader reader = new InputStreamReader(in, "UTF-8");
+            final CSVReader csvReader = new CSVReader(reader, ';');
 
-            List<String[]> lines = new ArrayList<String[]>();
-            String[]       line  = null;
+            final byte[] BOM = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
+            final char bomChar = new String(BOM, "UTF-8").charAt(0);
+            final StringBuilder bomCharCheckBuilder = new StringBuilder().append(bomChar).append("#");
 
+            final List<String[]> lines = new ArrayList<String[]>();
+            String[] line = null;
             while ((line = csvReader.readNext()) != null) {
                 if (line != null) {
-                    if (!line[0].startsWith("#") && line.length > 0) {
+                    if (line.length > 0 && !line[0].startsWith("#") && !line[0].startsWith(bomCharCheckBuilder.toString())) {
                         if (line[0].replace("'", "").length() > 0) {
                             lines.add(line);
                         }
@@ -94,7 +79,7 @@
 
             return lines;
         }
-        catch (IOException ce) {
+        catch (final IOException ce) {
             log.error(ce.getLocalizedMessage());
         }
 

http://dive4elements.wald.intevation.org