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: 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: ingo@299: /** 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: sascha@721: River river = flysArtifact.getRiver(); 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 :