felix@4345: package de.intevation.flys.exports.extreme; felix@4345: felix@4345: import java.awt.Color; felix@4345: felix@4345: import org.apache.log4j.Logger; felix@4345: import org.jfree.chart.JFreeChart; felix@4345: import org.jfree.chart.plot.Marker; felix@4345: import org.jfree.chart.plot.ValueMarker; felix@4345: import org.jfree.chart.title.TextTitle; felix@4362: import org.jfree.data.xy.XYSeries; felix@4345: import org.w3c.dom.Document; felix@4345: felix@4345: import de.intevation.artifactdatabase.state.ArtifactAndFacet; felix@4345: import de.intevation.artifactdatabase.state.Facet; felix@4345: import de.intevation.flys.artifacts.access.FixAnalysisAccess; felix@4345: import de.intevation.flys.artifacts.model.DateRange; felix@4345: import de.intevation.flys.artifacts.model.FacetTypes; felix@4345: import de.intevation.flys.artifacts.model.extreme.Curve; felix@4345: import de.intevation.flys.artifacts.model.extreme.ExtremeCurveFacet; felix@4362: import de.intevation.flys.artifacts.resources.Resources; felix@4345: import de.intevation.flys.exports.fixings.FixWQCurveGenerator; felix@4362: import de.intevation.flys.exports.StyledSeriesBuilder; felix@4345: import de.intevation.flys.exports.ChartGenerator; felix@4345: import de.intevation.flys.jfree.JFreeUtil; felix@4345: import de.intevation.flys.jfree.StyledXYSeries; felix@4345: felix@4345: /** felix@4345: * Generator for WQ fixing charts. felix@4345: * @author Christian Lins felix@4345: */ felix@4345: public class ExtremeWQCurveGenerator felix@4345: extends FixWQCurveGenerator felix@4345: implements FacetTypes felix@4345: { felix@4345: /** Private logger. */ felix@4345: private static Logger logger = felix@4345: Logger.getLogger(ExtremeWQCurveGenerator.class); felix@4345: felix@4345: public static final String I18N_CHART_TITLE = felix@4345: "chart.extreme.wq.title"; felix@4345: felix@4345: public static final String I18N_CHART_SUBTITLE = felix@4345: "chart.extreme.wq.subtitle"; felix@4345: felix@4345: public static final String I18N_CHART_SUBTITLE1 = felix@4345: "chart.extreme.wq.subtitle1"; felix@4345: felix@4345: public static final String I18N_XAXIS_LABEL = felix@4345: "chart.extreme.wq.xaxis.label"; felix@4345: felix@4345: public static final String I18N_YAXIS_LABEL = felix@4345: "chart.extreme.wq.yaxis.label"; felix@4345: felix@4345: public static final String I18N_CHART_TITLE_DEFAULT = felix@4345: "Extremkurvenanalyse"; felix@4345: felix@4345: public static final String I18N_XAXIS_LABEL_DEFAULT = felix@4345: "Q [m\u00B3/s]"; felix@4345: felix@4345: public static final String I18N_YAXIS_LABEL_DEFAULT = felix@4345: "W [NN + m]"; felix@4345: felix@4345: felix@4362: @Override felix@4362: public boolean prepareChartData(ArtifactAndFacet aaf, Document theme, boolean visible) { felix@4362: if (!super.prepareChartData(aaf, theme, visible)) { felix@4362: String name = aaf.getFacetName(); felix@4362: if (name.equals(EXTREME_WQ_CURVE)) { felix@4362: doExtremeCurveOut(aaf, theme, visible); felix@4362: return true; felix@4362: } felix@4362: else if (name.equals(EXTREME_WQ_CURVE_BASE)) { felix@4362: doExtremeCurveBaseOut(aaf, theme, visible); felix@4362: return true; felix@4362: } felix@4362: return false; felix@4362: } felix@4362: return true; felix@4362: } felix@4345: felix@4362: /** Do Extreme Curve nonextrapolated points out. */ felix@4362: protected void doExtremeCurveBaseOut(ArtifactAndFacet aaf, Document theme, boolean visible) { felix@4362: logger.debug("doExtremeCurveBaseOut"); felix@4362: ExtremeCurveFacet facet = (ExtremeCurveFacet) aaf.getFacet(); felix@4362: Curve curve = (Curve) facet.getData(aaf.getArtifact(), context); felix@4362: if (curve == null) { felix@4362: logger.warn("doExtremeCurveiBaseOut: Facet does not contain Curve"); felix@4345: return; felix@4345: } felix@4362: felix@4362: XYSeries qwseries = new StyledXYSeries("meas", theme); felix@4362: StyledSeriesBuilder.addPointsQW(qwseries, curve.getQs(), curve.getWs()); felix@4362: felix@4362: addAxisSeries(qwseries, YAXIS.W.idx, visible); felix@4345: } felix@4345: felix@4345: felix@4345: /** Do Extreme Curve out */ felix@4362: protected void doExtremeCurveOut(ArtifactAndFacet aaf, Document theme, boolean visible) { felix@4345: logger.debug("doExtremeCurveOut"); felix@4345: ExtremeCurveFacet facet = (ExtremeCurveFacet) aaf.getFacet(); felix@4345: Curve curve = (Curve) facet.getData(aaf.getArtifact(), context); felix@4345: if (curve == null) { felix@4345: logger.warn("doExtremeCurveOut: Facet does not contain Curve"); felix@4345: return; felix@4345: } felix@4345: felix@4345: double maxQ = curve.getSuggestedMaxQ(); felix@4345: if (maxQ == Double.MAX_VALUE) { felix@4345: maxQ = 8000; felix@4345: } felix@4345: felix@4345: StyledXYSeries series = JFreeUtil.sampleFunction2D( felix@4345: curve, felix@4362: theme, felix@4345: aaf.getFacetDescription(), felix@4345: 500, // number of samples felix@4345: 0.0 , // start felix@4345: maxQ); // end felix@4345: felix@4345: // Add marker from where on its extrapolated. felix@4345: double[] qs = curve.getQs(); felix@4345: double extrapolateFrom = qs[qs.length-1]; felix@4345: felix@4345: Marker m = new ValueMarker(extrapolateFrom); felix@4345: m.setPaint(Color.black); felix@4345: addDomainMarker(m); felix@4345: felix@4345: addAxisSeries(series, 0, visible); felix@4345: } felix@4345: felix@4362: felix@4345: @Override felix@4345: protected String getChartTitle() { felix@4345: return Resources.format( felix@4345: context.getMeta(), felix@4345: I18N_CHART_TITLE, felix@4345: I18N_CHART_TITLE_DEFAULT, felix@4345: context.getContextValue(CURRENT_KM)); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected String getDefaultChartTitle() { felix@4345: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected String getDefaultChartSubtitle() { felix@4345: FixAnalysisAccess access = new FixAnalysisAccess(artifact); felix@4345: DateRange dateRange = access.getDateRange(); felix@4345: DateRange refRange = access.getReferencePeriod(); felix@4345: felix@4345: if (dateRange != null && refRange != null) { felix@4345: return Resources.format( felix@4345: context.getMeta(), felix@4345: I18N_CHART_SUBTITLE, felix@4345: "", felix@4345: access.getRiver(), felix@4345: dateRange.getFrom(), felix@4345: dateRange.getTo(), felix@4345: refRange.getFrom(), felix@4345: refRange.getTo()); felix@4345: } felix@4345: felix@4345: return null; felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected void addSubtitles(JFreeChart chart) { felix@4345: String defaultSubtitle = getDefaultChartSubtitle(); felix@4345: felix@4345: if (defaultSubtitle == null || defaultSubtitle.length() == 0) { felix@4345: return; felix@4345: } felix@4345: felix@4345: chart.addSubtitle(new TextTitle(defaultSubtitle)); felix@4345: felix@4345: StringBuilder buf = new StringBuilder(); felix@4345: felix@4345: // Add analysis periods as additional subtitle felix@4345: FixAnalysisAccess access = new FixAnalysisAccess(artifact); felix@4345: DateRange[] aperiods = access.getAnalysisPeriods(); felix@4345: buf.append(msg("fix.analysis.periods")); felix@4345: buf.append(": "); felix@4345: for(int n = 0; n < aperiods.length; n++) { felix@4345: buf.append( felix@4345: Resources.format( felix@4345: context.getMeta(), felix@4345: I18N_CHART_SUBTITLE1, felix@4345: "", felix@4345: aperiods[n].getFrom(), felix@4345: aperiods[n].getTo())); felix@4345: if(n + 1 < aperiods.length) { felix@4345: buf.append("; "); felix@4345: } felix@4345: } felix@4345: felix@4345: chart.addSubtitle(new TextTitle(buf.toString())); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected String getDefaultXAxisLabel() { felix@4345: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected String getDefaultYAxisLabel(int pos) { felix@4345: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); felix@4345: } felix@4345: felix@4345: @Override felix@4345: protected ChartGenerator.YAxisWalker getYAxisWalker() { felix@4345: return new YAxisWalker() { felix@4345: @Override felix@4345: public int length() { felix@4345: return YAXIS.values().length; felix@4345: } felix@4345: felix@4345: @Override felix@4345: public String getId(int idx) { felix@4345: YAXIS[] yaxes = YAXIS.values(); felix@4345: return yaxes[idx].toString(); felix@4345: } felix@4345: }; felix@4345: } felix@4345: } felix@4345: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :