ingo@389: package de.intevation.flys.exports;
ingo@389:
ingo@389: import java.io.IOException;
ingo@389: import java.io.OutputStream;
ingo@389: import java.io.OutputStreamWriter;
ingo@389: import java.util.ArrayList;
ingo@389: import java.util.List;
ingo@389:
ingo@389: import org.w3c.dom.Document;
ingo@389:
ingo@389: import org.apache.log4j.Logger;
ingo@389:
ingo@389: import au.com.bytecode.opencsv.CSVWriter;
ingo@389:
ingo@389: import de.intevation.artifacts.Artifact;
ingo@389: import de.intevation.artifacts.CallContext;
ingo@389:
ingo@389: import de.intevation.flys.artifacts.WINFOArtifact;
ingo@389: import de.intevation.flys.artifacts.model.WQKms;
ingo@389:
ingo@389:
ingo@389: /**
ingo@389: * @author Ingo Weinzierl
ingo@389: */
ingo@389: public class WaterlevelExporter implements OutGenerator {
ingo@389:
ingo@389: /** The logger used in this exporter.*/
ingo@389: private static Logger logger = Logger.getLogger(WaterlevelExporter.class);
ingo@389:
ingo@389:
ingo@389: public static final String WATERLEVEL_FACET_CSV = "waterlevel_export.csv";
ingo@389:
ingo@389: public static final String DEFAULT_CSV_CHARSET = "UTF-8";
ingo@389:
ingo@389: public static final char DEFAULT_CSV_SEPARATOR = ',';
ingo@389:
ingo@389:
ingo@389: /** The document of the incoming out() request.*/
ingo@389: protected Document request;
ingo@389:
ingo@389: /** The output stream where the data should be written to.*/
ingo@389: protected OutputStream out;
ingo@389:
ingo@389: /** The CallContext object.*/
ingo@389: protected CallContext context;
ingo@389:
ingo@389: /** The selected facet.*/
ingo@389: protected String facet;
ingo@389:
ingo@389: /** The storage that contains all WQKms objects for the different facets.*/
ingo@389: protected List data;
ingo@389:
ingo@389:
ingo@389: public void init(Document request, OutputStream out, CallContext context) {
ingo@389: logger.debug("WaterlevelExporter.init");
ingo@389:
ingo@389: this.request = request;
ingo@389: this.out = out;
ingo@389: this.context = context;
ingo@389: this.data = new ArrayList();
ingo@389: }
ingo@389:
ingo@389:
ingo@389: /**
ingo@389: * This doOut() just collects the data of multiple artifacts. The real data
ingo@389: * generation takes place in the concrete generate() methods.
ingo@389: *
ingo@389: * @param artifact The artifact.
ingo@389: * @param facet The facet to add - NOTE: the facet needs to fit to the first
ingo@389: * facet inserted into this exporter. Otherwise this artifact/facet is
ingo@389: * skipped.
ingo@389: * @param attr The attr document.
ingo@389: */
ingo@389: public void doOut(Artifact artifact, String facet, Document attr) {
ingo@389: logger.debug("WaterlevelExporter.doOut: " + facet);
ingo@389:
ingo@389: if (!isFacetValid(facet)) {
ingo@389: logger.warn("Facet '" + facet + "' not valid. No output created!");
ingo@389: return;
ingo@389: }
ingo@389:
ingo@389: data.add(getWaterlevelData(artifact));
ingo@389: }
ingo@389:
ingo@389:
ingo@389: public void generate()
ingo@389: throws IOException
ingo@389: {
ingo@389: if (facet != null && facet.equals(WATERLEVEL_FACET_CSV)) {
ingo@389: generateCSV();
ingo@389: }
ingo@389: else {
ingo@389: throw new IOException("invalid facet for exporter.");
ingo@389: }
ingo@389: }
ingo@389:
ingo@389:
ingo@389: /**
ingo@389: * Determines if the desired facet is valid for this exporter. If no facet
ingo@389: * is currently set, facet is set.
ingo@389: *
ingo@389: * @param facet The desired facet.
ingo@389: *
ingo@389: * @return true, if facet is valid, otherwise false.
ingo@389: */
ingo@389: protected boolean isFacetValid(String facet) {
ingo@389: logger.debug("WaterlevelExporter.isFacetValid");
ingo@389:
ingo@389: if (facet == null || facet.length() == 0) {
ingo@389: return false;
ingo@389: }
ingo@389: else if (this.facet == null || this.facet.length() == 0) {
ingo@389: logger.debug("Set the facet of this export: " + facet);
ingo@389: this.facet = facet;
ingo@389:
ingo@389: return true;
ingo@389: }
ingo@389: else {
ingo@389: return this.facet.equals(facet);
ingo@389: }
ingo@389: }
ingo@389:
ingo@389:
ingo@389: /**
ingo@389: * Returns the waterlevel data computed by the WINFOArtifact.
ingo@389: *
ingo@389: * @param artifact The WINFOArtifact.
ingo@389: *
ingo@389: * @return the computed waterlevel data.
ingo@389: */
ingo@389: protected WQKms[] getWaterlevelData(Artifact artifact) {
ingo@389: WINFOArtifact winfoArtifact = (WINFOArtifact) artifact;
ingo@389: WQKms[] wqkms = winfoArtifact.getWaterlevelData();
ingo@389:
ingo@389: logger.debug("Got " + wqkms.length + " WQKms objects.");
ingo@389:
ingo@389: return wqkms;
ingo@389: }
ingo@389:
ingo@389:
ingo@389: protected void generateCSV()
ingo@389: throws IOException
ingo@389: {
ingo@389: logger.info("WaterlevelExporter.generateCSV");
ingo@389:
ingo@389: CSVWriter writer = new CSVWriter(
ingo@389: new OutputStreamWriter(
ingo@389: out,
ingo@389: DEFAULT_CSV_CHARSET),
ingo@389: DEFAULT_CSV_SEPARATOR);
ingo@389:
ingo@389: for (WQKms[] tmp: data) {
ingo@389: for (WQKms wqkms: tmp) {
ingo@389: wQKms2CSV(writer, wqkms);
ingo@389: }
ingo@389: }
ingo@389:
ingo@389: writer.close();
ingo@389: }
ingo@389:
ingo@389:
ingo@389: protected void wQKms2CSV(CSVWriter writer, WQKms wqkms) {
ingo@389: logger.debug("WaterlevelExporter.wQKms2CSV");
ingo@389:
ingo@389: int size = wqkms.size();
ingo@389: double[] result = new double[3];
ingo@389:
ingo@389: for (int i = 0; i < size; i ++) {
ingo@389: result = wqkms.get(i, result);
ingo@389:
ingo@389: writer.writeNext(new String[] {
ingo@389: Double.toString(result[2]),
ingo@389: Double.toString(result[0]),
ingo@389: Double.toString(result[1])
ingo@389: });
ingo@389: }
ingo@389: }
ingo@389: }
ingo@389: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :