felix@1151: package de.intevation.flys.exports; felix@1151: felix@1151: import org.apache.log4j.Logger; felix@1151: felix@1151: import org.jfree.chart.JFreeChart; felix@1170: import org.jfree.chart.plot.XYPlot; felix@1151: import org.jfree.chart.title.TextTitle; felix@1151: import org.jfree.data.xy.XYSeries; felix@1151: felix@1151: import org.w3c.dom.Document; felix@1151: felix@1151: import de.intevation.artifacts.Artifact; felix@1151: felix@1151: import de.intevation.artifactdatabase.state.Facet; felix@1151: felix@1151: import de.intevation.flys.artifacts.FLYSArtifact; felix@1151: import de.intevation.flys.artifacts.model.FacetTypes; felix@1151: import de.intevation.flys.artifacts.model.WKms; felix@1151: felix@1162: import de.intevation.flys.utils.DataUtil; felix@1627: import de.intevation.flys.model.DischargeTable; felix@1627: import de.intevation.flys.model.Gauge; felix@1627: import de.intevation.flys.model.River; felix@1627: import de.intevation.flys.model.TimeInterval; felix@1627: felix@1627: import de.intevation.flys.artifacts.WINFOArtifact; felix@1627: felix@1627: import de.intevation.flys.artifacts.model.WQKms; felix@1627: import de.intevation.flys.utils.FLYSUtils; felix@1627: felix@1162: felix@1151: felix@1151: /** felix@1151: * An OutGenerator that generates w differences curves. felix@1151: */ felix@1151: public class WDifferencesCurveGenerator felix@1151: extends LongitudinalSectionGenerator felix@1151: implements FacetTypes felix@1151: { felix@1151: /** The logger that is used in this generator. */ felix@1151: private static Logger logger = felix@1151: Logger.getLogger(WDifferencesCurveGenerator.class); felix@1151: felix@1151: public static final String I18N_CHART_TITLE = felix@1151: "chart.w_differences.title"; felix@1151: felix@1151: public static final String I18N_CHART_SUBTITLE = felix@1151: "chart.w_differences.subtitle"; felix@1151: felix@1151: public static final String I18N_2YAXIS_LABEL = felix@1151: "chart.w_differences.yaxis.second.label"; felix@1151: felix@1151: // TODO proper i18n. felix@1151: public static final String I18N_CHART_TITLE_DEFAULT = "W-Differenzen"; felix@1151: public static final String I18N_XAXIS_LABEL_DEFAULT = "km"; felix@1151: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]"; felix@1151: felix@1151: felix@1151: /** felix@1151: * Add a subtitle to Chart. felix@1151: * @param chart Chart to add subtitle to. felix@1151: */ felix@1151: @Override felix@1151: protected void addSubtitles(JFreeChart chart) { felix@1151: String subtitle = msg(I18N_CHART_SUBTITLE, ""); felix@1151: chart.addSubtitle(new TextTitle(subtitle)); felix@1151: } felix@1151: felix@1151: felix@1151: /** felix@1151: * Add (themed) data for chart generation. felix@1151: */ felix@1151: public void doOut(Artifact artifact, Facet facet, Document attr) { felix@1151: String name = facet.getName(); felix@1151: felix@1151: logger.debug("WDifferencesCurveGenerator.doOut: " + name); felix@1151: felix@1151: if (name == null) { felix@1151: logger.error("No facet name for doOut(). No output generated!"); felix@1151: return; felix@1151: } felix@1151: felix@1151: FLYSArtifact flys = (FLYSArtifact) artifact; felix@1151: Facet f = flys.getNativeFacet(facet); felix@1151: felix@1151: if (f == null) { felix@1151: return; felix@1151: } felix@1151: felix@1151: if (name.equals(W_DIFFERENCES)) { felix@1153: doWDifferencesOut((WKms) f.getData(artifact, context), f.getDescription(), attr); felix@1151: } felix@1627: else if (name.equals(LONGITUDINAL_W)) { felix@1627: WINFOArtifact flysArtifact = (WINFOArtifact) artifact; felix@1627: facet = flysArtifact.getNativeFacet(facet); felix@1627: felix@1627: doWaterlevelOut((WQKms) facet.getData(artifact, context), f.getDescription(), attr, flysArtifact); felix@1627: felix@1627: } felix@1627: else { felix@1151: logger.warn("Unknown facet name: " + name); felix@1151: return; felix@1151: } felix@1151: } felix@1151: felix@1170: felix@1627: public void doWaterlevelOut(WQKms wqkms, felix@1627: String description, felix@1627: Document theme, felix@1627: WINFOArtifact flysArtifact) { felix@1627: String gaugeName = wqkms.getName(); felix@1627: felix@1627: River river = FLYSUtils.getRiver(flysArtifact); felix@1627: felix@1627: if (river == null) { felix@1627: logger.debug("no river found"); felix@1627: return; felix@1627: } felix@1627: felix@1627: Gauge gauge = river.determineGaugeByName(gaugeName); felix@1627: felix@1627: if (gauge == null) { felix@1627: logger.debug("no gauge found"); felix@1627: return; felix@1627: } felix@1627: felix@1627: String seriesName = "(tbd)Source for Diff."; felix@1627: //getSeriesName(gauge); felix@1627: felix@1627: double [][] values = new double [][] { felix@1627: wqkms.getQs(), wqkms.getWs() }; felix@1627: felix@1627: int size = values != null ? values[0].length : 0; felix@1627: felix@1627: XYSeries series = new StyledXYSeries(seriesName, theme); felix@1627: felix@1627: for (int i = 0; i < size; i++) { felix@1627: series.add(values[0][i], values[1][i]); felix@1627: } felix@1627: felix@1627: addSecondAxisSeries(series); felix@1627: } felix@1627: felix@1151: /** felix@1151: * Add items to dataseries which describes the differences. felix@1151: */ felix@1153: protected void doWDifferencesOut(WKms wkms, String seriesName, Document theme) { felix@1151: logger.debug("WDifferencesCurveGenerator.doWDifferencesOut"); felix@1151: if (wkms == null) { felix@1151: logger.warn("No data to add to WDifferencesChart."); felix@1151: return; felix@1162: } felix@1162: felix@1162: int size = wkms.size(); felix@1162: XYSeries series = new StyledXYSeries(seriesName, theme); felix@1162: felix@1162: if (logger.isDebugEnabled()) { felix@1162: if (wkms.size() > 0) { felix@1162: logger.debug("Generate series: " + series.getKey()); felix@1162: logger.debug("Start km: " + wkms.getKm(0)); felix@1162: logger.debug("End km: " + wkms.getKm(size-1)); felix@1162: logger.debug("Values : " + size); felix@1162: } felix@1151: } felix@1151: felix@1162: for (int i = 0; i < size; i++) { felix@1162: series.add(wkms.getKm(i), wkms.getW(i)); felix@1162: } felix@1151: felix@1162: addFirstAxisSeries(series); felix@1162: if (DataUtil.guessWaterIncreasing(wkms)) { felix@1162: setInverted(true); felix@1162: } felix@1151: } felix@1151: felix@1151: felix@1151: /** felix@1170: * felix@1170: */ felix@1170: @Override felix@1170: public JFreeChart generateChart() { felix@1170: JFreeChart chart = super.generateChart(); felix@1170: if (chart != null && chart.getPlot() != null) { felix@1170: XYPlot plot = (XYPlot) chart.getPlot(); felix@1170: plot.setRangeZeroBaselineVisible(true); felix@1170: } felix@1170: return chart; felix@1170: } felix@1170: felix@1170: /** felix@1151: * Get name of series (displayed in legend). felix@1151: * @return name of the series. felix@1151: */ felix@1151: protected String getSeriesName(WKms wqkms, String mode) { felix@1151: String name = wqkms.getName(); felix@1151: String prefix = (name != null && name.indexOf(mode) >= 0) felix@1151: ? null felix@1151: : mode; felix@1151: felix@1151: return (prefix != null && prefix.length() > 0) felix@1151: ? prefix + "(" + name +")" felix@1151: : name; felix@1151: } felix@1151: } felix@1151: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :