changeset 9506:8b7bf26b8782

Predefined artifact for standard vegetation zones. Some minor adaptions.
author gernotbelger
date Fri, 28 Sep 2018 13:44:12 +0200
parents 3f230fe8eb19
children a7f75d61a634
files artifacts/doc/conf/meta-data.xml artifacts/src/main/java/org/dive4elements/river/artifacts/model/river/MainWstValuesCalculator.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedchannel/PredefinedChannelArtifact.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/UINFOArtifact.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/PredefinedVegetationZonesArtifact.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCrossSectionFacet.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCrossSectionProcessor.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationzonesAccess.java artifacts/src/main/resources/messages.properties artifacts/src/main/resources/messages_de.properties gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java gwt-client/src/main/webapp/WEB-INF/web.xml
diffstat 18 files changed, 308 insertions(+), 98 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/meta-data.xml	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/doc/conf/meta-data.xml	Fri Sep 28 13:44:12 2018 +0200
@@ -256,7 +256,7 @@
                     <dc:call-macro name="cross_sections" />
                     <dc:call-macro name="basedata_5_flood-protections" />
                     <dc:call-macro name="hyks" />
-                    <dc:call-macro name="predefined_vegetation_zones_cs" />
+                    <dc:call-macro name="predefined_vegetation_zones" />
                   </dc:when>
                   <dc:comment> Duration curve </dc:comment>
                   <dc:when test="$out = 'duration_curve'">
@@ -341,8 +341,7 @@
                     <dc:call-macro name="longitudinal-section-prototype" />
                   </dc:when>
                   <dc:when test="$out = 'uinfo.inundation_duration.vegzoneselect'">
-                    <dc:variable name="vegzonedata" expr="dc:defaultvegetationzone($river)"></dc:variable>
-                    <defaultVegetationZone factory="dummy" target_out="{$out}" data="{$vegzonedata}"></defaultVegetationZone>
+                    <dc:call-macro name="predefined_vegetation_zones" />
                   </dc:when>
                   <dc:when test="$out = 'bundu_wspl_longitudinal_section'">
                     <dc:call-macro name="longitudinal-section-prototype" />
@@ -1331,14 +1330,15 @@
       </hyks>
     </dc:macro>
 
- <!-- Default Vegetation Zones -->
-    <dc:macro name="predefined_vegetation_zones_cs">
-      <U-INFO>
-        <vegetation_zones> 
-          <dc:variable name="vegzonedata" expr="dc:defaultvegetationzone($river)"></dc:variable>
-            <defaultVegetationZone factory="dummy" target_out="{$out}" data="{$vegzonedata}"/>         
+    <!-- Default Vegetation Zones -->
+    <dc:macro name="predefined_vegetation_zones">
+      <uinfo>
+        <vegetation_zones>
+          <dc:variable name="vegzonedata" expr="dc:defaultvegetationzone($river)"/>
+
+          <defaultVegetationZone factory="predefined_vegetation_zonesf" target_out="{$out}" ids="{$vegzonedata}"/>         
         </vegetation_zones>
-      </U-INFO>
+      </uinfo>
     </dc:macro>
 
     <!-- wst-data -->
@@ -3779,10 +3779,7 @@
           <vegetation_zones>
             <dc:for-each>
               <dc:variable name="vegzonedata" expr="dc:data_from_artifact($a_gid,'vegzones')" />
-              <dc:variable name="vegzonedatalabel" expr="dc:get('ld_from')" />
-              <dc:variable name="label_temp" type="string" expr="dc:coalesce($collection_name, dc:toString($collection_gid))" />
-              <dc:variable name="fromkm" type="number" expr="dc:fromValue(dc:get('ld_mode'), dc:get('ld_locations'), dc:get('ld_from'))" />
-              <dc:variable name="tokm" type="number" expr="dc:fromValue(dc:get('ld_mode'), dc:get('ld_locations'), dc:get('ld_to'))" />
+              <dc:variable name="label_temp" type="string" expr="concat(dc:get('ld_f'), ' km - ', dc:get('ld_t'), ' km')" />
 
               <dc:element name="${facet_name}">
                 <dc:attribute name="factory" value="uinfo" />
@@ -3793,8 +3790,6 @@
                 <dc:attribute name="ids" value="${facet_num}" />
                 <!-- veg zones string as attribute -->
                 <dc:attribute name="data" value="${vegzonedata}" />
-                <dc:attribute name="from_km" value="${fromkm}" />
-                <dc:attribute name="to_km" value="${tokm}" /> 
               </dc:element>
             </dc:for-each>
           </vegetation_zones>
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/river/MainWstValuesCalculator.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/river/MainWstValuesCalculator.java	Fri Sep 28 13:44:12 2018 +0200
@@ -31,10 +31,11 @@
 
     private final Map<String, MainValueQPosition> positions;
 
-    private static class MainValueQPosition {
+    static class MainValueQPosition {
 
-        private final Map<Gauge, QPosition> gaugePositions = new HashMap<>();
-        private QPosition refGaugePositions = null;
+        public final Map<Gauge, QPosition> gaugePositions = new HashMap<>();
+
+        public QPosition refGaugePositions = null;
     }
 
     public static MainWstValuesCalculator forRiver(final CallContext context, final River river, final DoubleRange calcRange, final String... mainValueNames) {
@@ -93,7 +94,7 @@
 
     public boolean hasPosition(final String mainValueName) {
 
-        final MainValueQPosition position = this.positions.get(mainValueName);
+        final MainValueQPosition position = this.positions.get(mainValueName.toUpperCase());
         if (position == null)
             throw new IllegalArgumentException();
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedchannel/PredefinedChannelArtifact.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedchannel/PredefinedChannelArtifact.java	Fri Sep 28 13:44:12 2018 +0200
@@ -33,10 +33,11 @@
  * Display of a river channel data series loaded from database
  *
  * @author Matthias Schäfer
- *
  */
 public class PredefinedChannelArtifact extends AbstractStaticStateArtifact implements FacetTypes {
 
+    private static final long serialVersionUID = 1L;
+
     /** The log for this class. */
     private static Logger log = Logger.getLogger(PredefinedChannelArtifact.class);
 
@@ -48,7 +49,7 @@
         FacetActivity.Registry.getInstance().register(NAME, FacetActivity.INACTIVE);
     }
 
-    public static final String STATIC_STATE_NAME = "state.predefined_channel.static";
+    private static final String STATIC_STATE_NAME = "state.predefined_channel.static";
 
     /**
      * Trivial Constructor.
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/UINFOArtifact.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/UINFOArtifact.java	Fri Sep 28 13:44:12 2018 +0200
@@ -47,6 +47,8 @@
 
     private static final String FIELD_MODE = "calculation_mode";
 
+    public static final String FIELD_VEGZONES = "vegzones";
+
     static {
         // Active/deactivate facets.
         // BEWARE: we can only define one activity for "uinfo", so we use the artifact
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/PredefinedVegetationZonesArtifact.java	Fri Sep 28 13:44:12 2018 +0200
@@ -0,0 +1,117 @@
+/** 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.salix;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.dive4elements.artifactdatabase.state.DefaultOutput;
+import org.dive4elements.artifactdatabase.state.Facet;
+import org.dive4elements.artifactdatabase.state.FacetActivity;
+import org.dive4elements.artifacts.Artifact;
+import org.dive4elements.artifacts.ArtifactFactory;
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.artifacts.common.utils.XMLUtils;
+import org.dive4elements.river.artifacts.AbstractStaticStateArtifact;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.model.FacetTypes;
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.artifacts.states.StaticState;
+import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
+import org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZonesCrossSectionProcessor;
+import org.w3c.dom.Document;
+
+/**
+ * Display of vegetation zones loaded from database
+ *
+ * @author Gernot Belger
+ *
+ */
+public class PredefinedVegetationZonesArtifact extends AbstractStaticStateArtifact implements FacetTypes {
+
+    private static final long serialVersionUID = 1L;
+
+    /** Artifact name. */
+    private static final String NAME = "predefined_vegetation_zones";
+
+    private static final String DEFAULT_VEGZONES_DESCRIPTION = "uinfo_facet_vegetation_default_zones_cross_section.description";
+
+    private static final String STATIC_STATE_NAME = "state.predefined_vegetation_zones.static";
+
+    static {
+        // TODO: Move to configuration.
+        FacetActivity.Registry.getInstance().register(NAME, FacetActivity.INACTIVE);
+    }
+
+    /** The log for this class. */
+    private static Logger log = Logger.getLogger(PredefinedVegetationZonesArtifact.class);
+
+    @Override
+    public String getName() {
+        return NAME;
+    }
+
+    @Override
+    protected void initStaticState() {
+
+        final StaticState state = new StaticState(STATIC_STATE_NAME);
+        final DefaultOutput output = new DefaultOutput("general", "general", "image/png", "chart");
+
+        final List<Facet> facets = getFacets(STATIC_STATE_NAME);
+        output.addFacets(facets);
+        state.addOutput(output);
+
+        setStaticState(state);
+    }
+
+    /**
+     * Gets called from factory, to set things up.
+     */
+    @Override
+    public void setup(final String identifier, final ArtifactFactory factory, final Object context, final CallMeta callMeta, final Document data,
+            final List<Class> loadFacets) {
+
+        if (log.isDebugEnabled())
+            log.debug(XMLUtils.toString(data));
+
+        final String vegZoneData = getDatacageIDValue(data);
+
+        createFacets(callMeta, vegZoneData);
+
+        super.setup(identifier, factory, context, callMeta, data, loadFacets);
+    }
+
+    private void createFacets(final CallMeta callMeta, final String vegZoneData) {
+        if (vegZoneData == null)
+            return;
+
+        addStringData(UINFOArtifact.FIELD_VEGZONES, vegZoneData);
+
+        final String seriesName = Resources.getMsg(callMeta, DEFAULT_VEGZONES_DESCRIPTION);
+
+        final List<Facet> facets = new ArrayList<>(1);
+        facets.add(VegetationZonesCrossSectionProcessor.createVegetationZonesCrossSectionFacet(seriesName));
+        addFacets(STATIC_STATE_NAME, facets);
+    }
+
+    @Override
+    protected void initialize(final Artifact artifact, final Object context, final CallMeta meta) {
+        // do not clone facets, etc. from master artifact
+
+        log.debug("initialize");
+        importData((D4EArtifact) artifact, "river");
+        importData((D4EArtifact) artifact, "ld_from");
+        importData((D4EArtifact) artifact, "ld_to");
+
+        log.debug("ld_from " + getDataAsString("ld_from"));
+        log.debug("ld_to " + getDataAsString("ld_to"));
+    }
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java	Fri Sep 28 13:44:12 2018 +0200
@@ -127,5 +127,4 @@
         }
         return null;
     }
-
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java	Fri Sep 28 13:44:12 2018 +0200
@@ -10,7 +10,6 @@
 package org.dive4elements.river.artifacts.uinfo.salix;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.Map.Entry;
 import java.util.NavigableMap;
@@ -43,16 +42,13 @@
     private static final String MAIN_VALUE_HQ5 = "HQ5";
 
     private static final double SALIX_DISTANCE = 2.31;
-    private final List<ResultRow> rows = new ArrayList<>();
 
     private final RiverInfoProvider riverInfoProvider;
 
-
     public SalixLineCalculator(final RiverInfoProvider riverInfoProvider) {
         this.riverInfoProvider = riverInfoProvider;
     }
 
-
     /**
      * Calculate the salix line result rows
      */
@@ -65,17 +61,30 @@
         final WINFOArtifact winfo = new WinfoArtifactWrapper(uinfo);
         winfo.addStringData("ld_mode", "distance");
         winfo.addStringData("ld_step", "100");
-        for (final double station : new ComputationRangeAccess(winfo).getKms()) {
-            this.rows.add(createRow(mainWstValues, station, rangeScenarios));
+
+        final List<ResultRow> rows = new ArrayList<>();
+        for (final double station : new ComputationRangeAccess(winfo).getKms())
+            rows.add(createRow(mainWstValues, station, rangeScenarios));
+
+        final SalixLineCalculationResult result = createResult(scenarioType, scenarioLabels, rangeString, additionalString, rows);
+        results.addResult(result, problems);
+    }
+
+    private SalixLineCalculationResult createResult(final ScenarioType scenarioType, final String[] scenarioLabels, final String rangeString,
+            final String additionalString, final List<ResultRow> rows) {
+
+        switch (scenarioType) {
+        case REGIONAL:
+            return new SalixLineCalculationRegionalResult("Salix-regional", scenarioLabels, rangeString, additionalString, rows);
+
+        case SUPRAREGIONAL:
+            return new SalixLineCalculationSupraRegionalResult("Salix-supra", scenarioLabels, rangeString, additionalString, rows);
+
+        case HISTORICAL:
+            return new SalixLineCalculationHistoricalResult("Salix-hist", scenarioLabels, rangeString, additionalString, rows);
+        default:
+            return new SalixLineCalculationResult("Salix-simple", rows);
         }
-        if (scenarioType == ScenarioType.REGIONAL)
-            results.addResult(new SalixLineCalculationRegionalResult("Salix-regional", scenarioLabels, rangeString, additionalString, this.rows), problems);
-        else if (scenarioType == ScenarioType.SUPRAREGIONAL)
-            results.addResult(new SalixLineCalculationSupraRegionalResult("Salix-supra", scenarioLabels, rangeString, additionalString, this.rows), problems);
-        else if (scenarioType == ScenarioType.HISTORICAL)
-            results.addResult(new SalixLineCalculationHistoricalResult("Salix-hist", scenarioLabels, rangeString, additionalString, this.rows), problems);
-        else
-            results.addResult(new SalixLineCalculationResult("Salix-simple", this.rows), problems);
     }
 
     private MainWstValuesCalculator fetchGaugeMainValuePositions2(final Calculation problems) {
@@ -169,14 +178,27 @@
         return noScen;
     }
 
-    /**
-     * Searches the row of a station in a result rows collection
-     */
-    private ResultRow searchStation(final double station, final Collection<ResultRow> rows) {
-        for (final ResultRow row : rows) {
-            if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001)
-                return row;
-        }
-        return null;
-    }
-}
+    // /**
+    // * Find and return a height (iota, w main value) of a station in a previously calculated result
+    // */
+    // public double fetchStationHeight(final double station, final AbstractResultType resultType,
+    // final SalixLineCalculationResult result) {
+    //
+    // // Search the station in the previously calculated result rows
+    // final ResultRow stationRow = searchStation(station, result.getRows());
+    // if (stationRow != null)
+    // return stationRow.getDoubleValue(resultType);
+    // return Double.NaN;
+    // }
+
+    // /**
+    // * Searches the row of a station in a result rows collection
+    // */
+    // private ResultRow searchStation(final double station, final Collection<ResultRow> rows) {
+    // for (final ResultRow row : rows) {
+    // if (row.getDoubleValue(GeneralResultType.station) > station + 0.0001)
+    // return row;
+    // }
+    // return null;
+    // }
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java	Fri Sep 28 13:44:12 2018 +0200
@@ -62,7 +62,9 @@
             rows.add(row2);
         }
 
-        final VegetationZonesCalculationResult result = new VegetationZonesCalculationResult("Ergebnis 1", rows);
+        final String label = String.format("%.3f - %.3f", calcRange.getMinimumDouble(), calcRange.getMaximumDouble());
+
+        final VegetationZonesCalculationResult result = new VegetationZonesCalculationResult(label, rows);
 
         results.addResult(result, problems);
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCrossSectionFacet.java	Fri Sep 28 13:44:12 2018 +0200
@@ -0,0 +1,63 @@
+/** 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.vegetationzones;
+
+import org.dive4elements.artifacts.Artifact;
+import org.dive4elements.artifacts.CallContext;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.model.BlackboardDataFacet;
+import org.dive4elements.river.artifacts.model.FacetTypes;
+import org.dive4elements.river.exports.CrossSectionGenerator;
+
+/**
+ * @author Gernot Belger
+ *
+ */
+public final class VegetationZonesCrossSectionFacet extends BlackboardDataFacet implements FacetTypes {
+
+    private static final long serialVersionUID = 1L;
+
+    public VegetationZonesCrossSectionFacet(final String name, final String description) {
+        super(0, name, description);
+
+        this.metaData.put("X", CrossSectionGenerator.I18N_XAXIS_LABEL);
+        this.metaData.put("Y", CrossSectionGenerator.I18N_YAXIS_LABEL);
+    }
+
+    /**
+     * Returns the data this facet requires.
+     *
+     * @param artifact
+     *            the owner artifact.
+     * @param context
+     *            the CallContext (ignored).
+     *
+     * @return
+     *         the data as PredefinedChannelQueryCalculationResult
+     */
+    @Override
+    public Object getData(final Artifact artifact, final CallContext context) {
+
+        final VegetationzonesAccess vAccess = new VegetationzonesAccess((D4EArtifact) artifact);
+        return VegetationZoneServerClientXChange.parse(vAccess.getVegZones());
+    }
+
+    /**
+     * Create a deep copy of this Facet.
+     *
+     * @return a deep copy.
+     */
+    @Override
+    public VegetationZonesCrossSectionFacet deepCopy() {
+        final VegetationZonesCrossSectionFacet copy = new VegetationZonesCrossSectionFacet(this.name, this.description);
+        copy.set(this);
+        return copy;
+    }
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCrossSectionProcessor.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCrossSectionProcessor.java	Fri Sep 28 13:44:12 2018 +0200
@@ -19,11 +19,10 @@
 import org.dive4elements.artifacts.Artifact;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.artifacts.DataProvider;
-import org.dive4elements.river.artifacts.common.AbstractCalculationResult;
+import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.common.AbstractProcessor;
 import org.dive4elements.river.artifacts.model.CrossSectionFacetUtils;
 import org.dive4elements.river.artifacts.model.river.MainWstValuesCalculator;
-import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
 import org.dive4elements.river.exports.CrossSectionGenerator;
 import org.dive4elements.river.exports.DiagramGenerator;
 import org.dive4elements.river.jfree.StripedAreaDataset;
@@ -42,7 +41,6 @@
 
     public static final String FACET_VEGETATION_ZONES_CROSS_SECTION = "uinfo_facet_vegetation_zones_cross_section";
 
-    private static final String FACET_VEGETATION_ZONES_CROSS_SECTION_DESCRIPTION = "uinfo_facet_vegetation_zones_cross_section.description";
 
     private static final Set<String> HANDLED_FACET_TYPES = new HashSet<>();
 
@@ -50,10 +48,9 @@
         HANDLED_FACET_TYPES.add(FACET_VEGETATION_ZONES_CROSS_SECTION);
     }
 
-    public static Facet createVegetationZonesCrossSectionFacet(final CallContext context, final String hash, final String id,
-            final AbstractCalculationResult result, final int index) {
-        return AbstractProcessor.createFacet(context, hash, id, result, index, CrossSectionGenerator.I18N_XAXIS_LABEL, FACET_VEGETATION_ZONES_CROSS_SECTION,
-                FACET_VEGETATION_ZONES_CROSS_SECTION_DESCRIPTION);
+    public static Facet createVegetationZonesCrossSectionFacet(final String description) {
+
+        return new VegetationZonesCrossSectionFacet(FACET_VEGETATION_ZONES_CROSS_SECTION, description);
     }
 
     public static void generateSeries(final CrossSectionGenerator generator, final ArtifactAndFacet bundle, final CallContext context,
@@ -70,7 +67,7 @@
             final StripedAreaDataset dataset = new StripedAreaDataset(theme);
 
             final Artifact artifact = bundle.getArtifact();
-            final VegetationzonesAccess vAccess = new VegetationzonesAccess((UINFOArtifact) artifact);
+            final VegetationzonesAccess vAccess = new VegetationzonesAccess((D4EArtifact) artifact);
             final River river = vAccess.getRiver();
             final List<VegetationZoneServerClientXChange> zones = VegetationZoneServerClientXChange.parse(vAccess.getVegZones());
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java	Fri Sep 28 13:44:12 2018 +0200
@@ -21,6 +21,7 @@
 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.resources.Resources;
 import org.dive4elements.river.artifacts.states.DefaultState;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
 
@@ -34,6 +35,8 @@
 
     private static final long serialVersionUID = 1L;
 
+    private static final String FACET_VEGETATION_ZONES_CROSS_SECTION_DESCRIPTION = "uinfo_facet_vegetation_zones_cross_section.description";
+
     /**
      * From this state can only be continued trivially.
      */
@@ -80,7 +83,10 @@
 
         if (!resultList.isEmpty()) {
 
-            facets.add(VegetationZonesCrossSectionProcessor.createVegetationZonesCrossSectionFacet(context, hash, this.id, resultList.get(0), 0));
+            final String label = resultList.get(0).getLabel();
+            final String facetDescription = Resources.getMsg(context.getMeta(), FACET_VEGETATION_ZONES_CROSS_SECTION_DESCRIPTION, new Object[] { label });
+
+            facets.add(VegetationZonesCrossSectionProcessor.createVegetationZonesCrossSectionFacet(facetDescription));
 
             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);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationzonesAccess.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationzonesAccess.java	Fri Sep 28 13:44:12 2018 +0200
@@ -10,10 +10,9 @@
 
 package org.dive4elements.river.artifacts.uinfo.vegetationzones;
 
+import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.access.RangeAccess;
-import org.dive4elements.river.artifacts.common.EpochYearAccessHelper;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
-import org.dive4elements.river.artifacts.uinfo.UinfoCalcMode;
 
 /**
  * Access to the flow depth calculation type specific SInfo artifact data.
@@ -25,24 +24,16 @@
  */
 final class VegetationzonesAccess extends RangeAccess {
 
-    private final EpochYearAccessHelper helper;
-
     // Fields from state:
     // calculation_mode (String)
     // ld_from, ld_to,ld_step
     // vegzones (String)
 
-    public VegetationzonesAccess(final UINFOArtifact uinfo) {
+    public VegetationzonesAccess(final D4EArtifact uinfo) {
         super(uinfo);
-
-        /* assert calculation mode */
-        final UinfoCalcMode calculationMode = uinfo.getCalculationMode();
-        this.helper = new EpochYearAccessHelper(uinfo);
-        assert (calculationMode == UinfoCalcMode.uinfo_vegetation_zones);
     }
 
     public String getVegZones() {
-        return super.getString("vegzones");
+        return super.getString(UINFOArtifact.FIELD_VEGZONES);
     }
-
 }
\ No newline at end of file
--- a/artifacts/src/main/resources/messages.properties	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/resources/messages.properties	Fri Sep 28 13:44:12 2018 +0200
@@ -1193,7 +1193,8 @@
 uinfo_facet_salix_scenario = Iota Scenario, {0}
 uinfo_facet_salix_scenario.filtered.description = Iota Scenario, {0}
 uinfo_facet_salix_scenario.raw.description = Iota Scenario, {0} (raw data)
-uinfo_facet_vegetation_zones_cross_section.description = Vegetation Zones
+uinfo_facet_vegetation_zones_cross_section.description = Vegetation Zones ({0})
+uinfo_facet_vegetation_default_zones_cross_section.description = Standard Vegetation Zones
 uinfo_salix_scenario_deltaw = \u0394MW={0}
 uinfo_salix_scenario_supraregional = supraregional
 uinfo_salix_scenario_historical = historical
--- a/artifacts/src/main/resources/messages_de.properties	Fri Sep 28 10:16:12 2018 +0200
+++ b/artifacts/src/main/resources/messages_de.properties	Fri Sep 28 13:44:12 2018 +0200
@@ -1193,7 +1193,8 @@
 uinfo_facet_salix_scenario = Iota Szenario, {0}
 uinfo_facet_salix_scenario.filtered.description = Iota Szenario, {0}
 uinfo_facet_salix_scenario.raw.description = Iota Szenario, {0} (Rohdaten)
-uinfo_facet_vegetation_zones_cross_section.description = Vegetationszonen
+uinfo_facet_vegetation_zones_cross_section.description = Vegetationszonen ({0})
+uinfo_facet_vegetation_default_zones_cross_section.description = Standardvegetationszonen
 uinfo_salix_scenario_deltaw = \u0394MW={0}
 uinfo_salix_scenario_supraregional = \u00fcberregional
 uinfo_salix_scenario_historical = historisch
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Fri Sep 28 10:16:12 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Fri Sep 28 13:44:12 2018 +0200
@@ -831,7 +831,7 @@
 uinfo_salix_line_export = Iota Export
 uinfo_vegetation_zones_export = Vegetation Zones Export
 uinfo_vegetation_zones_report = Vegetation  Zones Report
-defaultVegetationZone = Default Vegetation Zone
+defaultVegetationZone = Standard Vegetation Zones
 
 vegetation_zones = Vegetation Zones
 uinfo_vegetation_zone_overlap = Ranges are overlapping.
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Fri Sep 28 10:16:12 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Fri Sep 28 13:44:12 2018 +0200
@@ -831,7 +831,7 @@
 uinfo_salix_line_export = Iota Export
 uinfo_vegetation_zones_export = Vegetationszonen Export
 uinfo_vegetation_zones_report = Vegetationszonen Bericht
-defaultVegetationZone = Standardvegetationszone
+defaultVegetationZone = Standardvegetationszonen
 
 vegetation_zones = Vegetationszonen
 uinfo_vegetation_zone_overlap = Bereiche \u00fcberlappen.
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java	Fri Sep 28 10:16:12 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java	Fri Sep 28 13:44:12 2018 +0200
@@ -12,7 +12,6 @@
 
 import org.dive4elements.river.client.client.ui.DatacageWidget;
 import org.dive4elements.river.client.client.ui.DatacageWidgetData;
-import org.dive4elements.river.client.shared.model.ArtifactDescription;
 import org.dive4elements.river.client.shared.model.DataList;
 import org.dive4elements.river.client.shared.model.User;
 
@@ -29,7 +28,7 @@
 
     private static final long serialVersionUID = 1L;
 
-    private final static Double DELTA = 0.0000001;
+    // private final static Double DELTA = 0.0000001;
 
     private final User user;
 
@@ -39,7 +38,7 @@
     // private final Double vegZoneTo = null;
     // private final Label kmOverlapLabel = new Label();
 
-    // TODO: in der LV steht, dass eine Warnung herausgegeben werden soll, wenn der kmBereich der ausgewählten
+    // REMARK:: in der LV steht, dass eine Warnung herausgegeben werden soll, wenn der kmBereich der ausgewählten
     // Vegetationszone NICHT überlappt.
     // Derzeit werden durch den XPathQuery (siehe meta-data.xml usw) solche Vegetationszonen ohnehin gefiltert (nicht
     // angezeigt) - so wie es bisher überall standard ist, sodass
@@ -64,7 +63,6 @@
         final DatacageWidgetData data = new DatacageWidgetData(this.artifact, this.user, "uinfo.inundation_duration.vegZoneSelect", "load-system:true", false);
 
         final DatacageWidget datacage = new DatacageWidget(data);
-        final ArtifactDescription artifact = this.artifact.getArtifactDescription();
 
         // for (final DataList item : artifact.getOldData()) {
         // if (item.getState().equals("state.uinfo.inundationduration.distance_only")) {
@@ -86,24 +84,7 @@
         plusBtn.addClickHandler(new ClickHandler() {
             @Override
             public void onClick(final ClickEvent event) {
-                final List<TreeNode> selection = datacage.getPlainSelection();
-                if (selection == null || selection.isEmpty()) {
-                    SC.say(VegetationzonesTablePanel.this.MSG.warning());
-                    return;
-                }
-                final String data = selection.get(0).getAttribute("data");
-                // final String vegZoneFromStr = selection.get(0).getAttribute("from_km");
-                // final String vegZoneToStr = selection.get(0).getAttribute("to_km");
-                // if (vegZoneFromStr != null && vegZoneToStr != null) {
-                // VegetationzonesTablePanel.this.vegZoneFrom = Double.valueOf(vegZoneFromStr);
-                // VegetationzonesTablePanel.this.vegZoneTo = Double.valueOf(vegZoneToStr);
-                // } else {
-                // VegetationzonesTablePanel.this.vegZoneFrom = null;
-                // VegetationzonesTablePanel.this.vegZoneTo = null;
-                // }
-                createTableFromDataStr(data);
-                updateValidationMsgLabel();
-                // updateKmOverlapValidationLabel();
+                handlePlusClicked(datacage);
             }
         });
 
@@ -114,6 +95,37 @@
         return helperLayout;
     }
 
+    protected void handlePlusClicked(final DatacageWidget datacage) {
+        final List<TreeNode> selection = datacage.getPlainSelection();
+        if (selection == null || selection.isEmpty()) {
+            SC.say(VegetationzonesTablePanel.this.MSG.warning());
+            return;
+        }
+
+        final TreeNode selectedNode = selection.get(0);
+
+        /*
+         * the encoded veg-zones is either in 'data' or 'ids'. We need both, because we have the cases of stadnard vegzones and
+         * user-defined vegzones.
+         */
+        final String dataAttribute = selectedNode.getAttribute("data");
+        final String idsAttribute = selectedNode.getAttribute("ids");
+        final String vegZoneData = (dataAttribute == null || dataAttribute.trim().length() == 0) ? idsAttribute : dataAttribute;
+
+        // final String vegZoneFromStr = selection.get(0).getAttribute("from_km");
+        // final String vegZoneToStr = selection.get(0).getAttribute("to_km");
+        // if (vegZoneFromStr != null && vegZoneToStr != null) {
+        // VegetationzonesTablePanel.this.vegZoneFrom = Double.valueOf(vegZoneFromStr);
+        // VegetationzonesTablePanel.this.vegZoneTo = Double.valueOf(vegZoneToStr);
+        // } else {
+        // VegetationzonesTablePanel.this.vegZoneFrom = null;
+        // VegetationzonesTablePanel.this.vegZoneTo = null;
+        // }
+        createTableFromDataStr(vegZoneData);
+        updateValidationMsgLabel();
+        // updateKmOverlapValidationLabel();
+    }
+
     // private void updateKmOverlapValidationLabel() {
     // this.kmOverlapLabel.setText("MÖP");
     // if (this.vegZoneFrom != null && this.vegZoneTo != null) { // standardvegetationstabelle prüfung deaktiviert, da keine
@@ -126,4 +138,4 @@
     // }
     // }
     // }
-}
+}
\ No newline at end of file
--- a/gwt-client/src/main/webapp/WEB-INF/web.xml	Fri Sep 28 10:16:12 2018 +0200
+++ b/gwt-client/src/main/webapp/WEB-INF/web.xml	Fri Sep 28 13:44:12 2018 +0200
@@ -208,7 +208,7 @@
     <servlet-name>dynamicMainvalues</servlet-name>
     <servlet-class>org.dive4elements.river.client.server.DynamicMainValuesServiceImpl</servlet-class>
   </servlet>
-  
+
   <servlet>
     <servlet-name>dynamicMainvaluesTimeRangeDetermination</servlet-name>
     <servlet-class>org.dive4elements.river.client.server.DynamicMainValuesTimeRangeDeterminationServiceImpl</servlet-class>

http://dive4elements.wald.intevation.org