changeset 389:69d05357c177

Added an exporter (OutGenerator) for waterlevels which currently supports CSV exports. flys-artifacts/trunk@1810 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 03 May 2011 16:36:21 +0000
parents cc6840cbe503
children a67748ad4d61
files flys-artifacts/ChangeLog flys-artifacts/doc/conf/artifacts/winfo.xml flys-artifacts/doc/conf/conf.xml flys-artifacts/pom.xml flys-artifacts/src/main/java/de/intevation/flys/exports/WaterlevelExporter.java
diffstat 5 files changed, 204 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/ChangeLog	Tue May 03 16:26:35 2011 +0000
+++ b/flys-artifacts/ChangeLog	Tue May 03 16:36:21 2011 +0000
@@ -1,3 +1,17 @@
+2011-05-03  Ingo Weinzierl <ingo@intevation.de>
+
+	* doc/conf/artifacts/winfo.xml: Added a new output mode for the waterlevel
+	  state (CSV export).
+
+	* doc/conf/conf.xml: Added a new OutGenerator to export waterlevels.
+
+	* src/main/java/de/intevation/flys/exports/WaterlevelExporter.java: New.
+	  This OutGenerator exports the data of a waterlevel computation. Note:
+	  It is necessary to specify the desired facet (e.g.
+	  'waterlevel_export.csv').
+
+	* pom.xml: Added a dependency to OpenCSV.
+
 2011-05-03  Ingo Weinzierl <ingo@intevation.de>
 
 	* src/main/java/de/intevation/flys/collections/FLYSArtifactCollection.java:
--- a/flys-artifacts/doc/conf/artifacts/winfo.xml	Tue May 03 16:26:35 2011 +0000
+++ b/flys-artifacts/doc/conf/artifacts/winfo.xml	Tue May 03 16:36:21 2011 +0000
@@ -101,6 +101,11 @@
                         <facet name="longitudinal_section.q" description="facet.longitudinal_section.q"/>
                     </facets>
                 </outputmode>
+                <outputmode name="waterlevel_export" description="output.waterlevel_export" mime-type="text/plain">
+                    <facets>
+                        <facet name="waterlevel_export.csv" description="facet.waterlevel_export.csv" />
+                    </facets>
+                </outputmode>
             </outputmodes>
         </state>
 
--- a/flys-artifacts/doc/conf/conf.xml	Tue May 03 16:26:35 2011 +0000
+++ b/flys-artifacts/doc/conf/conf.xml	Tue May 03 16:36:21 2011 +0000
@@ -52,6 +52,7 @@
         <output-generator name="discharge_curve">de.intevation.flys.exports.DischargeCurveGenerator</output-generator>
         <output-generator name="longitudinal_section">de.intevation.flys.exports.LongitudinalSectionGenerator</output-generator>
         <output-generator name="duration_curve">de.intevation.flys.exports.DurationCurveGenerator</output-generator>
+        <output-generator name="waterlevel_export">de.intevation.flys.exports.WaterlevelExporter</output-generator>
     </output-generators>
 
     <rest-server>
--- a/flys-artifacts/pom.xml	Tue May 03 16:26:35 2011 +0000
+++ b/flys-artifacts/pom.xml	Tue May 03 16:36:21 2011 +0000
@@ -51,6 +51,11 @@
       <version>2.1.1</version>
     </dependency>
     <dependency>
+      <groupId>net.sf.opencsv</groupId>
+      <artifactId>opencsv</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
       <groupId>de.intevation.bsh.artifact-database</groupId>
       <artifactId>artifact-database</artifactId>
       <version>1.0-SNAPSHOT</version>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/WaterlevelExporter.java	Tue May 03 16:36:21 2011 +0000
@@ -0,0 +1,179 @@
+package de.intevation.flys.exports;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.w3c.dom.Document;
+
+import org.apache.log4j.Logger;
+
+import au.com.bytecode.opencsv.CSVWriter;
+
+import de.intevation.artifacts.Artifact;
+import de.intevation.artifacts.CallContext;
+
+import de.intevation.flys.artifacts.WINFOArtifact;
+import de.intevation.flys.artifacts.model.WQKms;
+
+
+/**
+ * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
+ */
+public class WaterlevelExporter implements OutGenerator {
+
+    /** The logger used in this exporter.*/
+    private static Logger logger = Logger.getLogger(WaterlevelExporter.class);
+
+
+    public static final String WATERLEVEL_FACET_CSV = "waterlevel_export.csv";
+
+    public static final String DEFAULT_CSV_CHARSET = "UTF-8";
+
+    public static final char DEFAULT_CSV_SEPARATOR = ',';
+
+
+    /** The document of the incoming out() request.*/
+    protected Document request;
+
+    /** The output stream where the data should be written to.*/
+    protected OutputStream out;
+
+    /** The CallContext object.*/
+    protected CallContext context;
+
+    /** The selected facet.*/
+    protected String facet;
+
+    /** The storage that contains all WQKms objects for the different facets.*/
+    protected List<WQKms[]> data;
+
+
+    public void init(Document request, OutputStream out, CallContext context) {
+        logger.debug("WaterlevelExporter.init");
+
+        this.request = request;
+        this.out     = out;
+        this.context = context;
+        this.data    = new ArrayList<WQKms[]>();
+    }
+
+
+    /**
+     * This doOut() just collects the data of multiple artifacts. The real data
+     * generation takes place in the concrete generate() methods.
+     *
+     * @param artifact The artifact.
+     * @param facet The facet to add - NOTE: the facet needs to fit to the first
+     * facet inserted into this exporter. Otherwise this artifact/facet is
+     * skipped.
+     * @param attr The attr document.
+     */
+    public void doOut(Artifact artifact, String facet, Document attr) {
+        logger.debug("WaterlevelExporter.doOut: " + facet);
+
+        if (!isFacetValid(facet)) {
+            logger.warn("Facet '" + facet + "' not valid. No output created!");
+            return;
+        }
+
+        data.add(getWaterlevelData(artifact));
+    }
+
+
+    public void generate()
+    throws IOException
+    {
+        if (facet != null && facet.equals(WATERLEVEL_FACET_CSV)) {
+            generateCSV();
+        }
+        else {
+            throw new IOException("invalid facet for exporter.");
+        }
+    }
+
+
+    /**
+     * Determines if the desired facet is valid for this exporter. If no facet
+     * is currently set, <i>facet</i> is set.
+     *
+     * @param facet The desired facet.
+     *
+     * @return true, if <i>facet</i> is valid, otherwise false.
+     */
+    protected boolean isFacetValid(String facet) {
+        logger.debug("WaterlevelExporter.isFacetValid");
+
+        if (facet == null || facet.length() == 0) {
+            return false;
+        }
+        else if (this.facet == null || this.facet.length() == 0) {
+            logger.debug("Set the facet of this export: " + facet);
+            this.facet = facet;
+
+            return true;
+        }
+        else {
+            return this.facet.equals(facet);
+        }
+    }
+
+
+    /**
+     * Returns the waterlevel data computed by the WINFOArtifact.
+     *
+     * @param artifact The WINFOArtifact.
+     *
+     * @return the computed waterlevel data.
+     */
+    protected WQKms[] getWaterlevelData(Artifact artifact) {
+        WINFOArtifact winfoArtifact = (WINFOArtifact) artifact;
+        WQKms[]       wqkms         = winfoArtifact.getWaterlevelData();
+
+        logger.debug("Got " + wqkms.length + " WQKms objects.");
+
+        return wqkms;
+    }
+
+
+    protected void generateCSV()
+    throws    IOException
+    {
+        logger.info("WaterlevelExporter.generateCSV");
+
+        CSVWriter writer = new CSVWriter(
+            new OutputStreamWriter(
+                out,
+                DEFAULT_CSV_CHARSET),
+            DEFAULT_CSV_SEPARATOR);
+
+        for (WQKms[] tmp: data) {
+            for (WQKms wqkms: tmp) {
+                wQKms2CSV(writer, wqkms);
+            }
+        }
+
+        writer.close();
+    }
+
+
+    protected void wQKms2CSV(CSVWriter writer, WQKms wqkms) {
+        logger.debug("WaterlevelExporter.wQKms2CSV");
+
+        int      size   = wqkms.size();
+        double[] result = new double[3];
+
+        for (int i = 0; i < size; i ++) {
+            result = wqkms.get(i, result);
+
+            writer.writeNext(new String[] {
+                Double.toString(result[2]),
+                Double.toString(result[0]),
+                Double.toString(result[1])
+            });
+        }
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org