Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/org/dive4elements/river/exports/HistoricalDischargeCurveGenerator.java @ 5831:bd047b71ab37
Repaired internal references
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:06:39 +0200 |
parents | flys-artifacts/src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java@b195fede1c3b |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/org/dive4elements/river/exports/HistoricalDischargeCurveGenerator.java Thu Apr 25 12:06:39 2013 +0200 @@ -0,0 +1,258 @@ +package org.dive4elements.river.exports; + +import java.util.Date; + +import org.apache.log4j.Logger; +import org.jfree.chart.plot.XYPlot; +import org.jfree.data.general.SeriesException; +import org.jfree.data.time.Day; +import org.jfree.data.time.RegularTimePeriod; +import org.jfree.data.time.TimeSeries; +import org.jfree.data.time.TimeSeriesCollection; +import org.w3c.dom.Document; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.river.artifacts.FLYSArtifact; +import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess; +import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.HistoricalWQTimerange; +import org.dive4elements.river.artifacts.model.Timerange; +import org.dive4elements.river.artifacts.model.WQTimerange; +import org.dive4elements.river.jfree.StyledTimeSeries; +import org.dive4elements.river.utils.FLYSUtils; + + +/** + * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> + */ +public class HistoricalDischargeCurveGenerator extends TimeseriesChartGenerator + implements FacetTypes { + + private static Logger logger = Logger + .getLogger(HistoricalDischargeCurveGenerator.class); + + public static final String I18N_CHART_TITLE = "chart.historical.discharge.title"; + + public static final String I18N_CHART_SUBTITLE = "chart.historical.discharge.subtitle"; + + public static final String I18N_XAXIS_LABEL = "chart.historical.discharge.xaxis.label"; + + public static final String I18N_YAXIS_LABEL = "chart.historical.discharge.yaxis.label"; + + public static final String I18N_YAXIS_SECOND_LABEL = "chart.historical.discharge.yaxis.second.label"; + + public static enum YAXIS { + W(0), Q(1); + + protected int idx; + + private YAXIS(int c) { + idx = c; + } + } + + @Override + protected YAxisWalker getYAxisWalker() { + return new YAxisWalker() { + + @Override + public int length() { + return YAXIS.values().length; + } + + @Override + public String getId(int idx) { + YAXIS[] yaxes = YAXIS.values(); + return yaxes[idx].toString(); + } + }; + } + + @Override + protected String getDefaultChartTitle() { + return msg(I18N_CHART_TITLE, I18N_CHART_TITLE); + } + + @Override + protected String getDefaultChartSubtitle() { + FLYSArtifact flys = (FLYSArtifact) master; + Timerange evalTime = new HistoricalDischargeAccess(flys) + .getEvaluationTimerange(); + + Object[] args = new Object[] { FLYSUtils.getReferenceGaugeName(flys), + evalTime.getStart(), evalTime.getEnd() }; + + return msg(I18N_CHART_SUBTITLE, "", args); + } + + @Override + protected String getDefaultXAxisLabel() { + return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL); + } + + @Override + protected String getDefaultYAxisLabel(int pos) { + if (pos == 0) { + return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL); + } + else if (pos == 1) { + return msg(I18N_YAXIS_SECOND_LABEL, I18N_YAXIS_SECOND_LABEL); + } + else { + return "NO TITLE FOR Y AXIS: " + pos; + } + } + + @Override + protected void adjustPlot(XYPlot plot) { + super.adjustPlot(plot); + plot.setRangeZeroBaselineVisible(true); + } + + @Override + public void doOut(ArtifactAndFacet artifactFacet, Document theme, + boolean visible) { + String name = artifactFacet.getFacetName(); + logger.debug("HistoricalDischargeCurveGenerator.doOut: " + name); + logger.debug("Theme description is: " + + artifactFacet.getFacetDescription()); + + if (name.equals(HISTORICAL_DISCHARGE_Q)) { + doHistoricalDischargeOutQ( + (FLYSArtifact) artifactFacet.getArtifact(), + artifactFacet.getData(context), + artifactFacet.getFacetDescription(), theme, visible); + } + else if (name.equals(HISTORICAL_DISCHARGE_W)) { + doHistoricalDischargeOutW( + (FLYSArtifact) artifactFacet.getArtifact(), + artifactFacet.getData(context), + artifactFacet.getFacetDescription(), theme, visible); + } + else if (name.equals(HISTORICAL_DISCHARGE_Q_DIFF)) { + doHistoricalDischargeDifferenceOutQ( + (FLYSArtifact) artifactFacet.getArtifact(), + artifactFacet.getData(context), + artifactFacet.getFacetDescription(), theme, visible); + } + else if (name.equals(HISTORICAL_DISCHARGE_W_DIFF)) { + doHistoricalDischargeDifferenceOutW( + (FLYSArtifact) artifactFacet.getArtifact(), + artifactFacet.getData(context), + artifactFacet.getFacetDescription(), theme, visible); + } + else if (FacetTypes.IS.MANUALPOINTS(name)) { + doPoints(artifactFacet.getData(context), artifactFacet, theme, + visible, YAXIS.Q.idx); + } + else { + logger.warn("doOut(): unknown facet name: " + name); + return; + } + } + + protected void doHistoricalDischargeOutQ(FLYSArtifact artifact, + Object data, String desc, Document theme, boolean visible) { + logger.debug("doHistoricalDischargeOut(): description = " + desc); + + WQTimerange wqt = (WQTimerange) data; + + TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), + wqt.getQs(), theme, desc); + + addAxisDataset(tsc, YAXIS.Q.idx, visible); + } + + protected void doHistoricalDischargeOutW(FLYSArtifact artifact, + Object data, String desc, Document theme, boolean visible) { + logger.debug("doHistoricalDischargeOut(): description = " + desc); + + WQTimerange wqt = (WQTimerange) data; + + TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), + wqt.getWs(), theme, desc); + + addAxisDataset(tsc, YAXIS.W.idx, visible); + } + + protected void doHistoricalDischargeDifferenceOutQ(FLYSArtifact artifact, + Object data, String desc, Document theme, boolean visible) { + logger.debug("doHistoricalDischargeDifferenceOut: desc = " + desc); + + HistoricalWQTimerange wqt = (HistoricalWQTimerange) data; + + TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), + wqt.getDiffs(), theme, desc); + + addAxisDataset(tsc, YAXIS.Q.idx, visible); + } + + protected void doHistoricalDischargeDifferenceOutW(FLYSArtifact artifact, + Object data, String desc, Document theme, boolean visible) { + logger.debug("doHistoricalDischargeDifferenceOut: desc = " + desc); + + HistoricalWQTimerange wqt = (HistoricalWQTimerange) data; + + TimeSeriesCollection tsc = newTimeSeriesCollection(wqt.getTimeranges(), + wqt.getDiffs(), theme, desc); + + addAxisDataset(tsc, YAXIS.W.idx, visible); + } + + /** + * Creates a new TimeSeriesCollection with a single TimeSeries. The + * TimeSeries will consist of two RegularTimePeriods for each W/Q value + * provided by <i>wqt</i>. This has the effect, that the line in the chart + * looks like a "step chart". + */ + protected TimeSeriesCollection newTimeSeriesCollection( + Timerange[] timeranges, double[] values, Document theme, String desc) { + logger.debug("Create new TimeSeriesCollection for: " + desc); + + TimeSeriesCollection tsc = new TimeSeriesCollection(); + TimeSeries series = new StyledTimeSeries(desc, theme); + + for (int i = 0, n = timeranges.length; i < n; i++) { + RegularTimePeriod[] rtp = newRegularTimePeriod(timeranges[i]); + + try { + if (Double.isNaN(values[i])) { + logger.warn("Skip TimePeriod because value is NaN."); + continue; + } + + series.add(rtp[0], values[i]); + series.add(rtp[1], values[i]); + + if (logger.isDebugEnabled()) { + logger.debug("added Item to TimeSeries:"); + logger.debug(" TimePeriod: " + rtp[0] + " - " + rtp[1]); + logger.debug(" Value: " + values[i]); + } + } + catch (SeriesException se) { + logger.warn("Error while adding TimePeriod: " + se); + } + } + + tsc.addSeries(series); + + return tsc; + } + + /** + * Creates an array that consists of two <i>Minute</i> periods [start, end]. + * + * @param timerange + * Supports start and end time. + * + * @return an array with two <i>Minute</i> periods [start, end]. + */ + protected RegularTimePeriod[] newRegularTimePeriod(Timerange timerange) { + Date start = new Date(timerange.getStart()); + Date end = new Date(timerange.getEnd() - 1000 * 60 * 60 * 24); + + return new RegularTimePeriod[] { new Day(start), new Day(end) }; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :