changeset 6794:23ab795f2f0e longitudinal-symmetry

Moved most of the functionality of FlowVelocityGenerator to LongitudinalSectionGenerator on the way to longitudinal-section symmetry. ToDos left.
author Tom Gottfried <tom@intevation.de>
date Fri, 09 Aug 2013 12:11:53 +0200
parents bdbe704dd433
children 7089f338138a
files artifacts/src/main/java/org/dive4elements/river/exports/FlowVelocityGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/MiddleBedHeightGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixLongitudinalSectionGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceEpochGenerator.java artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceYearGenerator.java artifacts/src/main/resources/messages.properties artifacts/src/main/resources/messages_de.properties artifacts/src/main/resources/messages_de_DE.properties artifacts/src/main/resources/messages_en.properties
diffstat 10 files changed, 306 insertions(+), 523 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/FlowVelocityGenerator.java	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/FlowVelocityGenerator.java	Fri Aug 09 12:11:53 2013 +0200
@@ -37,7 +37,7 @@
 
 
 /**
- * An OutGenerator that generates flow velocity curves.
+ * An OutGenerator that generates flow velocity diagramms.
  *
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
@@ -46,24 +46,21 @@
 implements   FacetTypes
 {
     public enum YAXIS {
-        V(0),
-        T(1),
-        Q(2),
-        D(3);
-        /* TODO Q and Density will come as 4th and 3rd axis. */
+        V(0), // flow velocity
+        T(1), // tau (shear stress)
+        Q(2), // discharge
+        O(3), // diameter
+        W(4), // waterlevel
+        D(5); // waterlevel-difference
         protected int idx;
         private YAXIS(int c) {
-           idx = c;
+            idx = c;
         }
     }
 
     /** The logger that is used in this generator. */
     private static Logger logger = Logger.getLogger(FlowVelocityGenerator.class);
 
-    /** Key to look up internationalized String for annotations label. */
-    public static final String I18N_ANNOTATIONS_LABEL =
-        "chart.flow_velocity.annotations.label";
-
     /**
      * Key to look up internationalized String for LongitudinalSection diagrams
      * titles.
@@ -71,298 +68,10 @@
     public static final String I18N_CHART_TITLE =
         "chart.flow_velocity.section.title";
 
-    /**
-     * Key to look up internationalized String for LongitudinalSection diagrams
-     * subtitles.
-     */
-    public static final String I18N_CHART_SUBTITLE =
-        "chart.flow_velocity.section.subtitle";
-
-    /**
-     * Key to look up internationalized String for LongitudinalSection diagrams
-     * short subtitles.
-     */
-    public static final String I18N_CHART_SHORT_SUBTITLE =
-        "chart.flow_velocity.section.shortsubtitle";
-
-    public static final String I18N_YAXIS_LABEL =
-        "chart.flow_velocity.section.yaxis.label";
-
-    public static final String I18N_2YAXIS_LABEL =
-        "chart.flow_velocity.section.yaxis.second.label";
-
-    public static final String I18N_3YAXIS_LABEL =
-        "chart.flow_velocity.section.yaxis.third.label";
-    public static final String I18N_4YAXIS_LABEL = "chart.bedquality.yaxis.label.diameter";
-
-    public static final String I18N_CHART_TITLE_DEFAULT  = "Geschwindigkeit- und Schubspannung";
-    public static final String I18N_YAXIS_LABEL_DEFAULT  = "Geschwindigkeit v [m/s]";
-    public static final String I18N_2YAXIS_LABEL_DEFAULT = "Schubspannung Tau [N]";
-    public static final String I18N_3YAXIS_LABEL_DEFAULT = "Q [m³/s]";
-    public static final String I18N_4YAXIS_LABEL_DEFAULT = "Durchmesser [mm]";
-
-    @Override
-    protected YAxisWalker getYAxisWalker() {
-        return new YAxisWalker() {
-            @Override
-            public int length() {
-                return YAXIS.values().length;
-            }
-
-            @Override
-            public String getId(int idx) {
-                YAXIS[] yaxes = YAXIS.values();
-                return yaxes[idx].toString();
-            }
-        };
-    }
-
-
-    /**
-     * Returns the default title for this chart.
-     *
-     * @return the default title for this chart.
-     */
-    @Override
-    public String getDefaultChartTitle() {
-        Object[] args = new Object[] {
-            getRiverName()
-        };
-
-        return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT, args);
-    }
-
-
-    /**
-     * Get internationalized label for the x axis.
-     */
-    @Override
-    protected String getDefaultXAxisLabel() {
-        D4EArtifact flys = (D4EArtifact) master;
-
-        return msg(
-            I18N_XAXIS_LABEL,
-            I18N_XAXIS_LABEL_DEFAULT,
-            new Object[] { RiverUtils.getRiver(flys).getName() });
-    }
-
-
-    @Override
-    protected String getDefaultYAxisLabel(int index) {
-        String label = "default";
-
-        if (index == YAXIS.V.idx) {
-            label = getVAxisLabel();
-        }
-        else if (index == YAXIS.T.idx) {
-            label = getTAxisLabel();
-        }
-        else if (index == YAXIS.Q.idx) {
-            label = getQAxisLabel();
-        }
-        else if (index == YAXIS.D.idx) {
-            label = getDAxisLabel();
-        }
-
-        return label;
-    }
-
-
-    /**
-     * Get internationalized label for the y axis.
-     */
-    protected String getVAxisLabel() {
-        return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
-    }
-
-
-    /**
-     * Get internationalized label for the y axis.
-     */
-    protected String getQAxisLabel() {
-        return msg(I18N_3YAXIS_LABEL, I18N_3YAXIS_LABEL_DEFAULT);
-    }
-
-    /**
-     * Get internationalized label for the y axis.
-     */
-    protected String getTAxisLabel() {
-        return msg(I18N_2YAXIS_LABEL, I18N_2YAXIS_LABEL_DEFAULT);
-    }
-
-    /**
-     * Get internationalized label for the y axis.
-     */
-    protected String getDAxisLabel() {
-        return msg(I18N_4YAXIS_LABEL, I18N_4YAXIS_LABEL_DEFAULT);
-    }
-
-    /**
-     * Produce output.
-     * @param artifactAndFacet current facet.
-     * @param attr  theme for facet
-     * @param visible Whether this facets data is actually visible or not.
+    /** TODO:
+     * are the following defined somewhere else too?
+     * remove them here!
      */
-    public void doOut(
-        ArtifactAndFacet artifactAndFacet,
-        Document         attr,
-        boolean          visible
-    ) {
-        String name = artifactAndFacet.getFacetName();
-
-        logger.debug("FlowVelocityGenerator.doOut: " + name);
-
-        if (name == null) {
-            logger.error("No facet name for doOut(). No output generated!");
-            return;
-        }
-
-        Facet facet = artifactAndFacet.getFacet();
-
-        if (facet == null) {
-            return;
-        }
-
-        if (getXBounds(0) != null && getDomainAxisRange() != null) {
-            logger.debug(Arrays.toString(getDomainAxisRangeFromRequest()));
-            Bounds bounds =
-                calculateZoom(getXBounds(0), getDomainAxisRange());
-            context.putContextValue("startkm", bounds.getLower());
-            context.putContextValue("endkm", bounds.getUpper());
-        }
-        else if (getXBounds(0) != null && getDomainAxisRange() == null) {
-            context.putContextValue("startkm", getXBounds(0).getLower());
-            context.putContextValue("endkm", getXBounds(0).getUpper());
-        }
-        else if (getXBounds(0) == null && getDomainAxisRange() == null) {
-            D4EArtifact artifact = (D4EArtifact)artifactAndFacet.getArtifact();
-            FlowVelocityAccess access = new FlowVelocityAccess(artifact);
-            context.putContextValue("startkm", access.getLowerKM());
-            context.putContextValue("endkm", access.getUpperKM());
-        }
-        else if (getXBounds(0) == null && getDomainAxisRange() != null){
-            D4EArtifact artifact = (D4EArtifact)artifactAndFacet.getArtifact();
-            FlowVelocityAccess access = new FlowVelocityAccess(artifact);
-            Bounds b = new DoubleBounds(access.getLowerKM(), access.getUpperKM());
-            Bounds bounds =
-                calculateZoom(b, getDomainAxisRange());
-            context.putContextValue("startkm", bounds.getLower());
-            context.putContextValue("endkm", bounds.getUpper());
-        }
-        if (name.equals(FLOW_VELOCITY_MAINCHANNEL)) {
-            doMainChannelOut(
-                (FlowVelocityData) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(FLOW_VELOCITY_TOTALCHANNEL)) {
-            doTotalChannelOut(
-                (FlowVelocityData) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(FLOW_VELOCITY_MAINCHANNEL_FILTERED)) {
-            doMainChannelOut(
-                (FlowVelocityData) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(FLOW_VELOCITY_TOTALCHANNEL_FILTERED)) {
-            doTotalChannelOut(
-                (FlowVelocityData) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(FLOW_VELOCITY_DISCHARGE)) {
-            doQOut(
-                (FlowVelocityData) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(FLOW_VELOCITY_TAU)) {
-            doTauOut(
-                (FlowVelocityData) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(FLOW_VELOCITY_TAU_FILTERED)) {
-            doTauOut(
-                (FlowVelocityData) artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-
-        else if (name.equals(FLOW_VELOCITY_ANNOTATION)) {
-            doAnnotations(
-                (RiverAnnotation) artifactAndFacet.getData(context),
-                 artifactAndFacet,
-                 attr,
-                 visible);
-        }
-        else if (FacetTypes.IS.AREA(name)) {
-            doArea(
-                artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (FacetTypes.IS.MANUALPOINTS(name)) {
-            doPoints(
-                artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible,
-                YAXIS.V.idx);
-        }
-        else if (name.equals(LONGITUDINAL_ANNOTATION)) {
-            doAnnotations(
-                (RiverAnnotation) artifactAndFacet.getData(context),
-                 artifactAndFacet,
-                 attr,
-                 visible);
-        }
-        else if (name.equals(FLOW_VELOCITY_MEASUREMENT)) {
-            doVPointOut(
-                 artifactAndFacet.getData(context),
-                 artifactAndFacet,
-                 attr,
-                 visible);
-        }
-        else if (name.equals(BED_QUALITY_BED_DIAMETER_SUBLAYER)) {
-            doBedQualitySubLayerOut(
-                (BedDiameterResult)artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(BED_QUALITY_BED_DIAMETER_TOPLAYER)) {
-            doBedQualityTopLayerOut(
-                (BedDiameterResult)artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else if (name.equals(BED_QUALITY_BEDLOAD_DIAMETER)) {
-            doBedQualityLoadDiameter(
-                (BedloadDiameterResult)artifactAndFacet.getData(context),
-                artifactAndFacet,
-                attr,
-                visible);
-        }
-        else {
-            logger.warn("Unknown facet name: " + name);
-            return;
-        }
-    }
-
-
     private void doBedQualityLoadDiameter(
         BedloadDiameterResult data,
         ArtifactAndFacet aandf,
@@ -397,155 +106,5 @@
         StyledSeriesBuilder.addPoints(series, data.getDiameterSubData(), true);
         addAxisSeries(series, YAXIS.D.idx, visible);
     }
-
-
-    /**
-     * Process the output for W facets in a longitudinal section curve.
-     *
-     * @param data A FlowVelocityData object
-     * @param aandf The facet. This facet does NOT support any data objects. Use
-     * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports
-     * data.
-     * @param theme The theme that contains styling information.
-     * @param visible The visibility of the curve.
-     */
-    protected void doMainChannelOut(
-        FlowVelocityData data,
-        ArtifactAndFacet aandf,
-        Document         theme,
-        boolean          visible
-    ) {
-        logger.debug("FlowVelocityGenerator.doMainChannelOut");
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-
-        StyledSeriesBuilder.addPoints(series, data.getMainChannelPoints(), true);
-
-        addAxisSeries(series, YAXIS.V.idx, visible);
-    }
-
-
-    /** Handle VWQKms. */
-    protected void doVPointOut (
-        Object data,
-        ArtifactAndFacet aandf,
-        Document         theme,
-        boolean          visible
-    ) {
-        logger.debug("FlowVelocityGenerator.doVPointOut");
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-
-        FlowVelocityMeasurementValue.FastFlowVelocityMeasurementValue
-            value = (FlowVelocityMeasurementValue.FastFlowVelocityMeasurementValue)
-                data;
-
-        StyledSeriesBuilder.addPoints(series, new double[][] {{value.getStation()},{value.getV()}}, true);
-
-        addAxisSeries(series, YAXIS.V.idx, visible);
-    }
-
-
-    /**
-     * Add items to dataseries which describes the differences.
-     */
-    protected void doTotalChannelOut(
-        FlowVelocityData data,
-        ArtifactAndFacet aandf,
-        Document         theme,
-        boolean          visible
-    ) {
-        logger.debug("FlowVelocityGenerator.doTotalChannelOut");
-
-        if (data == null) {
-            logger.warn("No data to add to FlowVelocity chart.");
-            return;
-         }
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-
-        StyledSeriesBuilder.addPoints(series, data.getTotalChannelPoints(), true);
-
-        addAxisSeries(series, YAXIS.V.idx, visible);
-    }
-
-
-
-    /**
-     * @param data A FlowVelocityData object
-     * @param aandf The facet. This facet does NOT support any data objects. Use
-     * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports
-     * data.
-     * @param theme The theme that contains styling information.
-     * @param visible The visibility of the curve.
-     */
-    protected void doQOut(
-        FlowVelocityData data,
-        ArtifactAndFacet aandf,
-        Document         theme,
-        boolean          visible
-    ) {
-        logger.debug("FlowVelocityGenerator.doTauOut");
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-
-        StyledSeriesBuilder.addPoints(series, data.getQPoints(), true);
-
-        addAxisSeries(series, YAXIS.Q.idx, visible);
-    }
-
-    /**
-     * @param data A FlowVelocityData object
-     * @param aandf The facet. This facet does NOT support any data objects. Use
-     * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports
-     * data.
-     * @param theme The theme that contains styling information.
-     * @param visible The visibility of the curve.
-     */
-    protected void doTauOut(
-        FlowVelocityData data,
-        ArtifactAndFacet aandf,
-        Document         theme,
-        boolean          visible
-    ) {
-        logger.debug("FlowVelocityGenerator.doTauOut");
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-
-        StyledSeriesBuilder.addPoints(series, data.getTauPoints(), true);
-
-        addAxisSeries(series, YAXIS.T.idx, visible);
-    }
-
-
-    /** Look up the axis identifier for a given facet type. */
-    public int axisIdxForFacet(String facetName) {
-        if (FacetTypes.IS.V(facetName)) {
-            return YAXIS.V.idx;
-        }
-        else if (FacetTypes.IS.T(facetName)) {
-            return YAXIS.T.idx;
-        }
-        else {
-            logger.warn("Could not find axis for facet " + facetName);
-            return YAXIS.V.idx;
-        }
-    }
-
-
-    /**
-     * Do Area out.
-     * @param theme styling information.
-     * @param visible whether or not visible.
-     */
-    protected void doArea(
-        Object     o,
-        ArtifactAndFacet aandf,
-        Document   theme,
-        boolean    visible
-    ) {
-        logger.debug("FlowVelocityGenerator.doArea");
-        logger.warn("TODO: Implement FlowVelocityGenerator.doArea");
-    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator.java	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator.java	Fri Aug 09 12:11:53 2013 +0200
@@ -8,6 +8,8 @@
 
 package org.dive4elements.river.exports;
 
+import java.util.Arrays;
+
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifactdatabase.state.Facet;
 import org.dive4elements.river.artifacts.D4EArtifact;
@@ -23,6 +25,12 @@
 import org.dive4elements.river.exports.process.BedheightProcessor;
 import org.dive4elements.river.exports.process.WOutProcessor;
 
+import org.dive4elements.river.artifacts.access.FlowVelocityAccess;
+import org.dive4elements.river.artifacts.model.FlowVelocityData;
+import org.dive4elements.river.model.FlowVelocityMeasurementValue;
+
+import org.dive4elements.river.jfree.Bounds;
+import org.dive4elements.river.jfree.DoubleBounds;
 import org.dive4elements.river.jfree.RiverAnnotation;
 import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
 import org.dive4elements.river.jfree.StyledXYSeries;
@@ -46,9 +54,12 @@
 implements   FacetTypes
 {
     public enum YAXIS {
-        W(0),
-        D(1),
-        Q(2);
+        W(0), // waterlevel
+        D(1), // waterlevel-difference
+        Q(2), // discharge
+        V(3), // flow velocity
+        T(4), // tau (shear stress)
+        O(3); // diameter
         protected int idx;
         private YAXIS(int c) {
             idx = c;
@@ -67,8 +78,13 @@
      * Key to look up internationalized String for LongitudinalSection diagrams
      * titles.
      */
+    /** TODO:
+     * create a class which extends this one to avoid following definition here 
+     */
     public static final String I18N_CHART_TITLE =
         "chart.longitudinal.section.title";
+    public static final String I18N_CHART_TITLE_DEFAULT  = 
+	"L\u00e4ngsschnitt";
 
     /**
      * Key to look up internationalized String for LongitudinalSection diagrams
@@ -84,24 +100,32 @@
     public static final String I18N_CHART_SHORT_SUBTITLE =
         "chart.longitudinal.section.shortsubtitle";
 
+    /**
+     * Key to look up internationalized String for LongitudinalSection diagrams
+     * X-axis title.
+     */
     public static final String I18N_XAXIS_LABEL =
         "chart.longitudinal.section.xaxis.label";
-
-    public static final String I18N_YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.label";
-
-    public static final String I18N_2YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.second.label";
+    public static final String I18N_XAXIS_LABEL_DEFAULT  = 
+	"km";
 
-    public static final String I18N_CHART_TITLE_DEFAULT  = "W-L\u00e4ngsschnitt";
-    public static final String I18N_XAXIS_LABEL_DEFAULT  = "km";
-    public static final String I18N_YAXIS_LABEL_DEFAULT  = "W [NN + m]";
-    public static final String I18N_2YAXIS_LABEL_DEFAULT = "Q [m\u00b3/s]";
+    /**
+     * Key to look up internationalized String for LongitudinalSection diagrams
+     * Y-axis titles.
+     */
+    public static final String I18N_YAXIS_LABEL_W =
+        "chart.longitudinal.section.yaxis.label.w";
+    public static final String I18N_YAXIS_LABEL_Q =
+        "chart.longitudinal.section.yaxis.label.q";
+    public static final String I18N_YAXIS_LABEL_D =
+        "chart.w_differences.yaxis.label";
+    public static final String I18N_YAXIS_LABEL_V =
+        "chart.flow_velocity.section.yaxis.label";
+    public static final String I18N_YAXIS_LABEL_T =
+        "chart.flow_velocity.section.yaxis.second.label";
+    public static final String I18N_YAXIS_LABEL_DEFAULT  = 
+	"Y-axis";
 
-    public final static String I18N_WDIFF_YAXIS_LABEL =
-        "chart.w_differences.yaxis.label";
-
-    public final static String I18N_WDIFF_YAXIS_LABEL_DEFAULT = "m";
 
     public LongitudinalSectionGenerator() {
         super();
@@ -218,36 +242,43 @@
     }
 
 
-    @Override
-    protected String getDefaultYAxisLabel(int index) {
-        String label = "default";
-
-        if (index == YAXIS.W.idx) {
-            label = getWAxisLabel();
-        }
-        else if (index == YAXIS.Q.idx) {
-            label = msg(getQAxisLabelKey(), getQAxisDefaultLabel());
-        }
-        else if (index == YAXIS.D.idx) {
-            label = msg(I18N_WDIFF_YAXIS_LABEL, I18N_WDIFF_YAXIS_LABEL_DEFAULT);
-        }
-
-        return label;
-    }
-
-
     /**
      * Get internationalized label for the y axis.
      */
-    protected String getWAxisLabel() {
+    @Override
+    protected String getDefaultYAxisLabel(int index) {
+
         D4EArtifact flys = (D4EArtifact) master;
-
         String unit = RiverUtils.getRiver(flys).getWstUnit().getName();
 
-        return msg(
-            I18N_YAXIS_LABEL,
-            I18N_YAXIS_LABEL_DEFAULT,
-            new Object[] { unit });
+        if (index == YAXIS.W.idx) {
+	    return msg(
+	        I18N_YAXIS_LABEL_W,
+		I18N_YAXIS_LABEL_DEFAULT,
+		new Object[] { unit });
+        }
+        if (index == YAXIS.Q.idx) {
+            return msg(
+	        I18N_YAXIS_LABEL_Q,
+		I18N_YAXIS_LABEL_DEFAULT);
+        }
+        if (index == YAXIS.D.idx) {
+            return msg(
+                I18N_YAXIS_LABEL_D, 
+		I18N_YAXIS_LABEL_DEFAULT);
+        }
+        if (index == YAXIS.V.idx) {
+            return msg(
+                I18N_YAXIS_LABEL_V, 
+		I18N_YAXIS_LABEL_DEFAULT);
+        }
+        if (index == YAXIS.T.idx) {
+            return msg(
+                I18N_YAXIS_LABEL_T, 
+		I18N_YAXIS_LABEL_DEFAULT);
+        }
+
+        return "default";
     }
 
 
@@ -272,23 +303,6 @@
 
 
     /**
-     * Get default value for the second Y-Axis' label (if no translation was
-     * found).
-     */
-    protected String getQAxisDefaultLabel() {
-        return I18N_2YAXIS_LABEL_DEFAULT;
-    }
-
-
-    /**
-     * Get key for internationalization of the second Y-Axis' label.
-     */
-    protected String getQAxisLabelKey() {
-        return I18N_2YAXIS_LABEL;
-    }
-
-
-    /**
      * Trigger inversion.
      */
     @Override
@@ -399,6 +413,92 @@
                 visible,
                 YAXIS.W.idx);
         }
+
+	/* output for flow velocity */
+        if (getXBounds(0) != null && getDomainAxisRange() != null) {
+            logger.debug(Arrays.toString(getDomainAxisRangeFromRequest()));
+            Bounds bounds =
+                calculateZoom(getXBounds(0), getDomainAxisRange());
+            context.putContextValue("startkm", bounds.getLower());
+            context.putContextValue("endkm", bounds.getUpper());
+        }
+        else if (getXBounds(0) != null && getDomainAxisRange() == null) {
+            context.putContextValue("startkm", getXBounds(0).getLower());
+            context.putContextValue("endkm", getXBounds(0).getUpper());
+        }
+        else if (getXBounds(0) == null && getDomainAxisRange() == null) {
+            D4EArtifact artifact = (D4EArtifact)artifactAndFacet.getArtifact();
+            FlowVelocityAccess access = new FlowVelocityAccess(artifact);
+            context.putContextValue("startkm", access.getLowerKM());
+            context.putContextValue("endkm", access.getUpperKM());
+        }
+        else if (getXBounds(0) == null && getDomainAxisRange() != null){
+            D4EArtifact artifact = (D4EArtifact)artifactAndFacet.getArtifact();
+            FlowVelocityAccess access = new FlowVelocityAccess(artifact);
+            Bounds b = new DoubleBounds(access.getLowerKM(), access.getUpperKM());
+            Bounds bounds =
+                calculateZoom(b, getDomainAxisRange());
+            context.putContextValue("startkm", bounds.getLower());
+            context.putContextValue("endkm", bounds.getUpper());
+        }
+        if (name.equals(FLOW_VELOCITY_MAINCHANNEL)) {
+            doMainChannelOut(
+                (FlowVelocityData) artifactAndFacet.getData(context),
+                artifactAndFacet,
+                attr,
+                visible);
+        }
+        else if (name.equals(FLOW_VELOCITY_TOTALCHANNEL)) {
+            doTotalChannelOut(
+                (FlowVelocityData) artifactAndFacet.getData(context),
+                artifactAndFacet,
+                attr,
+                visible);
+        }
+        else if (name.equals(FLOW_VELOCITY_MAINCHANNEL_FILTERED)) {
+            doMainChannelOut(
+                (FlowVelocityData) artifactAndFacet.getData(context),
+                artifactAndFacet,
+                attr,
+                visible);
+        }
+        else if (name.equals(FLOW_VELOCITY_TOTALCHANNEL_FILTERED)) {
+            doTotalChannelOut(
+                (FlowVelocityData) artifactAndFacet.getData(context),
+                artifactAndFacet,
+                attr,
+                visible);
+        }
+        else if (name.equals(FLOW_VELOCITY_DISCHARGE)) {
+            doQOut(
+                (FlowVelocityData) artifactAndFacet.getData(context),
+                artifactAndFacet,
+                attr,
+                visible);
+        }
+        else if (name.equals(FLOW_VELOCITY_TAU)) {
+            doTauOut(
+                (FlowVelocityData) artifactAndFacet.getData(context),
+                artifactAndFacet,
+                attr,
+                visible);
+        }
+        else if (name.equals(FLOW_VELOCITY_TAU_FILTERED)) {
+            doTauOut(
+                (FlowVelocityData) artifactAndFacet.getData(context),
+                artifactAndFacet,
+                attr,
+                visible);
+        }
+        else if (name.equals(FLOW_VELOCITY_MEASUREMENT)) {
+            doVPointOut(
+                 artifactAndFacet.getData(context),
+                 artifactAndFacet,
+                 attr,
+                 visible);
+        }
+
+
         else {
             logger.warn("Unknown facet name: " + name);
             return;
@@ -521,6 +621,12 @@
         else if (FacetTypes.IS.Q(facetName)) {
             return YAXIS.Q.idx;
         }
+        else if (FacetTypes.IS.V(facetName)) {
+            return YAXIS.V.idx;
+        }
+        else if (FacetTypes.IS.T(facetName)) {
+            return YAXIS.T.idx;
+        }
         else {
             logger.warn("Could not find axis for facet " + facetName);
             return YAXIS.W.idx;
@@ -627,5 +733,123 @@
         // Add area to the respective axis.
         addAreaSeries(area, axisIdxForFacet(data.getRootFacetName()), visible);
     }
+
+
+    /**
+     * flow velocity specific outs
+     */
+
+    /**
+     * Process the output for flow velocity in main channel in a longitudinal section curve.
+     *
+     * @param data A FlowVelocityData object
+     * @param aandf The facet. This facet does NOT support any data objects. Use
+     * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports
+     * data.
+     * @param theme The theme that contains styling information.
+     * @param visible The visibility of the curve.
+     */
+    protected void doMainChannelOut(
+        FlowVelocityData data,
+        ArtifactAndFacet aandf,
+        Document         theme,
+        boolean          visible
+    ) {
+        logger.debug("FlowVelocityGenerator.doMainChannelOut");
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+
+        StyledSeriesBuilder.addPoints(series, data.getMainChannelPoints(), true);
+
+        addAxisSeries(series, YAXIS.V.idx, visible);
+    }
+
+    /**
+     * Process the output for flow velocity in total channel in a longitudinal section curve.
+     */
+    protected void doTotalChannelOut(
+        FlowVelocityData data,
+        ArtifactAndFacet aandf,
+        Document         theme,
+        boolean          visible
+    ) {
+        logger.debug("FlowVelocityGenerator.doTotalChannelOut");
+
+        if (data == null) {
+            logger.warn("No data to add to FlowVelocity chart.");
+            return;
+         }
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+
+        StyledSeriesBuilder.addPoints(series, data.getTotalChannelPoints(), true);
+
+        addAxisSeries(series, YAXIS.V.idx, visible);
+    }
+
+    /**
+     * @param data A FlowVelocityData object
+     * @param aandf The facet. This facet does NOT support any data objects. Use
+     * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports
+     * data.
+     * @param theme The theme that contains styling information.
+     * @param visible The visibility of the curve.
+     */
+    protected void doTauOut(
+        FlowVelocityData data,
+        ArtifactAndFacet aandf,
+        Document         theme,
+        boolean          visible
+    ) {
+        logger.debug("FlowVelocityGenerator.doTauOut");
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+
+        StyledSeriesBuilder.addPoints(series, data.getTauPoints(), true);
+
+        addAxisSeries(series, YAXIS.T.idx, visible);
+    }
+
+    protected void doVPointOut (
+        Object data,
+        ArtifactAndFacet aandf,
+        Document         theme,
+        boolean          visible
+    ) {
+        logger.debug("FlowVelocityGenerator.doVPointOut");
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+
+        FlowVelocityMeasurementValue.FastFlowVelocityMeasurementValue
+            value = (FlowVelocityMeasurementValue.FastFlowVelocityMeasurementValue)
+                data;
+
+        StyledSeriesBuilder.addPoints(series, new double[][] {{value.getStation()},{value.getV()}}, true);
+
+        addAxisSeries(series, YAXIS.V.idx, visible);
+    }
+
+    /**
+     * @param data A FlowVelocityData object
+     * @param aandf The facet. This facet does NOT support any data objects. Use
+     * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports
+     * data.
+     * @param theme The theme that contains styling information.
+     * @param visible The visibility of the curve.
+     */
+    protected void doQOut(
+        FlowVelocityData data,
+	ArtifactAndFacet aandf,
+	Document         theme,
+        boolean          visible
+	) {
+	logger.debug("FlowVelocityGenerator.doTauOut");
+
+	XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+	
+	StyledSeriesBuilder.addPoints(series, data.getQPoints(), true);
+
+	addAxisSeries(series, YAXIS.Q.idx, visible);
+	}
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/exports/MiddleBedHeightGenerator.java	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/MiddleBedHeightGenerator.java	Fri Aug 09 12:11:53 2013 +0200
@@ -64,7 +64,7 @@
     public static final String I18N_CHART_TITLE_DEFAULT  = "Mittlere Sohlhöhe";
     public static final String I18N_YAXIS_LABEL_DEFAULT  = "mittlere Sohlhöhen [müNN]";
     public static final String I18N_W_YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.label";
+        "chart.longitudinal.section.yaxis.label.w";
     public static final String I18N_W_YAXIS_LABEL_DEFAULT  = "W [NN + m]";
     public static final String I18N_P_YAXIS_LABEL_DEFAULT  = "Gepeilte Breite [m]";
     public static final String I18N_P_YAXIS_LABEL =
--- a/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixLongitudinalSectionGenerator.java	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixLongitudinalSectionGenerator.java	Fri Aug 09 12:11:53 2013 +0200
@@ -64,10 +64,10 @@
             "chart.fixings.longitudinalsection.yaxis.label";
 
     public static final String I18N_W_YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.label";
+        "chart.longitudinal.section.yaxis.label.w";
 
     public static final String I18N_Q_YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.second.label";
+        "chart.longitudinal.section.yaxis.label.q";
 
     public static final String I18N_W_YAXIS_LABEL_DEFAULT  = "W [NN + m]";
     public static final String I18N_Q_YAXIS_LABEL_DEFAULT = "Q [m\u00b3/s]";
--- a/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceEpochGenerator.java	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceEpochGenerator.java	Fri Aug 09 12:11:53 2013 +0200
@@ -62,7 +62,7 @@
             "chart.fixings.longitudinalsection.yaxis.label";
 
     private static final String I18N_W_YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.label";
+        "chart.longitudinal.section.yaxis.label.w";
     private static final String I18N_W_YAXIS_LABEL_DEFAULT = "W [NN + m]";
 
 
--- a/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceYearGenerator.java	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceYearGenerator.java	Fri Aug 09 12:11:53 2013 +0200
@@ -63,7 +63,7 @@
     public static final String I18N_DW_YAXIS_LABEL =
             "chart.fixings.longitudinalsection.yaxis.label";
     private static final String I18N_W_YAXIS_LABEL =
-        "chart.longitudinal.section.yaxis.label";
+        "chart.longitudinal.section.yaxis.label.w";
     private static final String I18N_W_YAXIS_LABEL_DEFAULT = "W [NN + m]";
 
     @Override
--- a/artifacts/src/main/resources/messages.properties	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/resources/messages.properties	Fri Aug 09 12:11:53 2013 +0200
@@ -153,8 +153,8 @@
 chart.longitudinal.section.subtitle = Range: {0}-km {1,number,#.###} - {2,number,#.###}
 chart.longitudinal.section.shortsubtitle = {0}
 chart.longitudinal.section.xaxis.label = {0}-km
-chart.longitudinal.section.yaxis.label = W [{0}]
-chart.longitudinal.section.yaxis.second.label = Q [m\u00b3/s]
+chart.longitudinal.section.yaxis.label.w = W [{0}]
+chart.longitudinal.section.yaxis.label.q = Q [m\u00b3/s]
 chart.longitudinal.annotations.label = {0}.km
 
 chart.cross_section.title = Cross Section for river {0}
--- a/artifacts/src/main/resources/messages_de.properties	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/resources/messages_de.properties	Fri Aug 09 12:11:53 2013 +0200
@@ -159,8 +159,8 @@
 chart.longitudinal.section.subtitle = Bereich: {0}-km {1,number,#.###} - {2,number,#.###}
 chart.longitudinal.section.shortsubtitle = {0}
 chart.longitudinal.section.xaxis.label = {0}-km
-chart.longitudinal.section.yaxis.label = W [{0}]
-chart.longitudinal.section.yaxis.second.label = Q [m\u00b3/s]
+chart.longitudinal.section.yaxis.label.w = W [{0}]
+chart.longitudinal.section.yaxis.label.q = Q [m\u00b3/s]
 chart.longitudinal.annotations.label = {0}.km
 chart.discharge.curve.title = Abflusskurve
 chart.discharge.curve.xaxis.label = Q [m\u00b3/s]
--- a/artifacts/src/main/resources/messages_de_DE.properties	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/resources/messages_de_DE.properties	Fri Aug 09 12:11:53 2013 +0200
@@ -158,8 +158,8 @@
 chart.longitudinal.section.subtitle = Bereich: {0}-km {1,number,#.###} - {2,number,#.###}
 chart.longitudinal.section.shortsubtitle = {0}
 chart.longitudinal.section.xaxis.label = {0}-km
-chart.longitudinal.section.yaxis.label = W [{0}]
-chart.longitudinal.section.yaxis.second.label = Q [m\u00b3/s]
+chart.longitudinal.section.yaxis.label.w = W [{0}]
+chart.longitudinal.section.yaxis.label.q = Q [m\u00b3/s]
 chart.longitudinal.annotations.label = {0}.km
 chart.discharge.curve.title = Abflusskurve
 chart.discharge.curve.xaxis.label = Q [m\u00b3/s]
--- a/artifacts/src/main/resources/messages_en.properties	Thu Aug 08 17:36:44 2013 +0200
+++ b/artifacts/src/main/resources/messages_en.properties	Fri Aug 09 12:11:53 2013 +0200
@@ -158,8 +158,8 @@
 chart.longitudinal.section.subtitle = Range: {0}-km {1,number,#.###} - {2,number,#.###}
 chart.longitudinal.section.shortsubtitle = {0}
 chart.longitudinal.section.xaxis.label = {0}-km
-chart.longitudinal.section.yaxis.label = W [{0}]
-chart.longitudinal.section.yaxis.second.label = Q [m\u00b3/s]
+chart.longitudinal.section.yaxis.label.w = W [{0}]
+chart.longitudinal.section.yaxis.label.q = Q [m\u00b3/s]
 chart.longitudinal.annotations.label = {0}.km
 chart.computed.discharge.curve.gauge = Discharge curve at gauge {0} (km {1})
 chart.discharge.curve.title = Discharge Curve

http://dive4elements.wald.intevation.org