Mercurial > dive4elements > river
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 :