ingo@299: package de.intevation.flys.exports; ingo@299: ingo@299: import java.util.ArrayList; ingo@299: import java.util.List; ingo@299: import java.util.Map; 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@375: import org.jfree.chart.plot.XYPlot; ingo@299: import org.jfree.data.xy.DefaultXYDataset; ingo@299: ingo@299: import de.intevation.artifacts.Artifact; ingo@299: ingo@299: import de.intevation.flys.model.Gauge; ingo@381: import de.intevation.flys.model.River; ingo@299: ingo@299: import de.intevation.flys.artifacts.FLYSArtifact; ingo@299: import de.intevation.flys.artifacts.model.DischargeTables; ingo@299: import de.intevation.flys.artifacts.model.GaugesFactory; ingo@299: 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@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"; ingo@408: public static final String I18N_XAXIS_LABEL_DEFAULT = "Q [m³/s]"; ingo@408: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [cm]"; ingo@408: ingo@408: ingo@299: /** The Dataset that contains the data for the chart.*/ ingo@299: protected DefaultXYDataset dataset; ingo@299: ingo@299: ingo@299: public DischargeCurveGenerator() { ingo@348: super(); ingo@299: ingo@299: this.dataset = new DefaultXYDataset(); 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@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@375: protected void addDatasets(JFreeChart chart) { ingo@375: XYPlot plot = (XYPlot) chart.getPlot(); ingo@375: plot.setDataset(0, dataset); ingo@369: } ingo@369: ingo@369: ingo@364: public void doOut(Artifact artifact, String facet, Document attr) { ingo@364: logger.debug("DischargeCurveGenerator.doOut: " + facet); ingo@299: ingo@299: if (!(artifact instanceof FLYSArtifact)) { ingo@299: logger.error("Artifact is no instance of FLYSArtifact."); ingo@299: return; ingo@299: } ingo@299: ingo@299: FLYSArtifact flysArtifact = (FLYSArtifact) artifact; ingo@299: ingo@381: River river = flysArtifact.getRiver(); ingo@381: double[] distance = flysArtifact.getDistance(); ingo@299: ingo@299: List ranges = new ArrayList(); ingo@381: ranges.add(distance); ingo@299: ingo@299: List gauges = GaugesFactory.getGauges(river); ingo@299: List filtered = GaugesFactory.filterRanges(gauges, ranges); ingo@299: ingo@299: if (logger.isDebugEnabled()) { ingo@299: int numGauges = gauges != null ? gauges.size() : 0; ingo@299: int numFiltered = filtered != null ? filtered.size() : 0; ingo@299: ingo@299: logger.debug("++++++++++++++++++++"); ingo@381: logger.debug("Search gauges for river: " + river.getName()); ingo@381: logger.debug("-> ... from range: " + distance[0]); ingo@381: logger.debug("-> ... to range: " + distance[1]); ingo@299: logger.debug("-> Found " + numGauges + " gauges in total."); ingo@299: logger.debug("-> Found " + numFiltered + " gauges after filtering."); ingo@299: logger.debug("++++++++++++++++++++"); ingo@299: } ingo@299: ingo@299: String[] gaugeNames = new String[filtered.size()]; ingo@299: int idx = 0; ingo@299: for (Gauge gauge: filtered) { ingo@299: gaugeNames[idx++] = gauge.getName(); ingo@299: } ingo@299: ingo@381: DischargeTables dt = new DischargeTables(river.getName(), gaugeNames); ingo@299: Map gaugeValues = dt.getValues(100d); ingo@299: ingo@299: for (String gauge: gaugeNames) { ingo@299: double[][] values = gaugeValues.get(gauge); ingo@299: dataset.addSeries(gauge, values); ingo@299: } ingo@299: } ingo@299: } ingo@299: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :