ingo@299: package de.intevation.flys.exports;
ingo@299:
ingo@454: import java.util.Date;
ingo@299: import java.util.List;
ingo@299:
ingo@299: import org.apache.log4j.Logger;
ingo@299:
ingo@299: import org.w3c.dom.Document;
ingo@299:
ingo@375: import org.jfree.chart.JFreeChart;
ingo@728: import org.jfree.chart.axis.ValueAxis;
ingo@375: import org.jfree.chart.plot.XYPlot;
ingo@728: import org.jfree.data.Range;
ingo@923: import org.jfree.data.xy.XYSeries;
ingo@299:
ingo@299: import de.intevation.artifacts.Artifact;
ingo@299:
ingo@695: import de.intevation.artifactdatabase.state.Facet;
ingo@695:
ingo@454: import de.intevation.flys.model.DischargeTable;
ingo@299: import de.intevation.flys.model.Gauge;
ingo@381: import de.intevation.flys.model.River;
ingo@454: import de.intevation.flys.model.TimeInterval;
ingo@299:
sascha@1055: import de.intevation.flys.artifacts.WINFOArtifact;
ingo@299:
sascha@721: import de.intevation.flys.artifacts.model.WQKms;
ingo@299:
felix@1103: import de.intevation.flys.utils.FLYSUtils;
felix@1103:
ingo@299: /**
ingo@299: * An OutGenerator that generates discharge curves.
ingo@299: *
ingo@299: * @author Ingo Weinzierl
ingo@299: */
ingo@369: public class DischargeCurveGenerator extends XYChartGenerator {
ingo@299:
felix@1070: /** The logger used in this generator. */
ingo@299: private static Logger logger =
ingo@299: Logger.getLogger(DischargeCurveGenerator.class);
ingo@299:
ingo@299:
ingo@408: public static final String I18N_CHART_TITLE =
ingo@408: "chart.discharge.curve.title";
ingo@408:
ingo@414: public static final String I18N_CHART_SUBTITLE =
ingo@414: "chart.discharge.curve.subtitle";
ingo@414:
ingo@408: public static final String I18N_XAXIS_LABEL =
ingo@408: "chart.discharge.curve.xaxis.label";
ingo@408:
ingo@408: public static final String I18N_YAXIS_LABEL =
ingo@408: "chart.discharge.curve.yaxis.label";
ingo@408:
ingo@408: public static final String I18N_CHART_TITLE_DEFAULT = "Abflusskurven";
sascha@664: public static final String I18N_XAXIS_LABEL_DEFAULT = "Q [m\u00b3/s]";
ingo@408: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [cm]";
ingo@408:
ingo@408:
ingo@299:
ingo@299: public DischargeCurveGenerator() {
ingo@348: super();
ingo@299: }
ingo@299:
ingo@299:
ingo@369: protected String getChartTitle() {
ingo@408: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
ingo@369: }
ingo@369:
ingo@369:
ingo@414: @Override
ingo@414: protected void addSubtitles(JFreeChart chart) {
ingo@414:
ingo@414: }
ingo@414:
ingo@414:
ingo@369: protected String getXAxisLabel() {
ingo@408: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT);
ingo@369: }
ingo@369:
ingo@369:
ingo@369: protected String getYAxisLabel() {
ingo@408: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
ingo@369: }
ingo@369:
ingo@369:
ingo@728: @Override
ingo@728: protected boolean zoomX(XYPlot plot, ValueAxis axis, Range range, Range x) {
ingo@728: boolean zoomin = super.zoom(plot, axis, range, x);
ingo@728:
ingo@728: if (!zoomin) {
ingo@728: axis.setLowerBound(0d);
ingo@728: }
ingo@728:
ingo@728: return zoomin;
ingo@728: }
ingo@728:
ingo@728:
ingo@695: public void doOut(Artifact artifact, Facet facet, Document attr) {
ingo@695: logger.debug("DischargeCurveGenerator.doOut: " + facet.getName());
ingo@299:
sascha@1055: if (!(artifact instanceof WINFOArtifact)) {
sascha@1055: logger.debug("Artifact is no instance of WINFOArtifact.");
ingo@299: return;
ingo@299: }
ingo@299:
sascha@1055: WINFOArtifact flysArtifact = (WINFOArtifact) artifact;
ingo@299:
sascha@721: facet = flysArtifact.getNativeFacet(facet);
ingo@299:
sascha@721: if (facet == null) {
sascha@721: logger.debug("no facet found");
sascha@721: return;
ingo@299: }
ingo@299:
sascha@721: WQKms wqkms = (WQKms)facet.getData(flysArtifact, context);
sascha@721:
sascha@721: String gaugeName = wqkms.getName();
sascha@721:
felix@1103: River river = FLYSUtils.getRiver(flysArtifact);
sascha@721:
sascha@721: if (river == null) {
sascha@721: logger.debug("no river found");
sascha@721: return;
ingo@299: }
ingo@299:
sascha@721: Gauge gauge = river.determineGaugeByName(gaugeName);
ingo@299:
sascha@721: if (gauge == null) {
sascha@721: logger.debug("no gauge found");
sascha@721: return;
sascha@721: }
ingo@454:
sascha@721: String seriesName = getSeriesName(gauge);
sascha@721:
sascha@721: double [][] values = new double [][] {
sascha@721: wqkms.getQs(), wqkms.getWs() };
sascha@721:
ingo@923: int size = values != null ? values[0].length : 0;
ingo@923:
ingo@924: XYSeries series = new StyledXYSeries(seriesName, attr);
ingo@923:
ingo@923: for (int i = 0; i < size; i++) {
ingo@923: series.add(values[0][i], values[1][i]);
ingo@923: }
ingo@923:
ingo@923: addFirstAxisSeries(series);
ingo@299: }
ingo@454:
ingo@454:
ingo@454: protected String getSeriesName(Gauge gauge) {
ingo@743: // XXX The following code stops the artifact server accepting new HTTP
ingo@743: // requests. It needs more analysis! Is loading the discharge table a
ingo@743: // memory problem? Or is the time interval the problem?
ingo@454:
ingo@743: //List dts = gauge.getDischargeTables();
ingo@743:
ingo@743: //for (DischargeTable dt: dts) {
ingo@743: // if (dt.getKind() == 0) {
ingo@743: // TimeInterval ti = dt.getTimeInterval();
ingo@743:
ingo@743: // Date start = ti.getStartTime();
ingo@743: // Date end = ti.getStopTime();
ingo@743:
ingo@743: // String name = gauge.getName();
ingo@743:
ingo@743: // if (end == null) {
ingo@743: // Object[] args = new Object[] { name, start };
ingo@743: // return msg(
ingo@743: // "chart.discharge.curve.curve.valid.from",
ingo@743: // "",
ingo@743: // args);
ingo@743: // }
ingo@743: // else {
ingo@743: // Object[] args = new Object[] { name, start, end };
ingo@743: // return msg(
ingo@743: // "chart.discharge.curve.curve.valid.range",
ingo@743: // "",
ingo@743: // args);
ingo@743: // }
ingo@743: // }
ingo@743: //}
ingo@454:
ingo@454: return gauge.getName();
ingo@454: }
ingo@299: }
ingo@299: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :