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@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@4345: import de.intevation.flys.exports.fixings.FixWQCurveGenerator; felix@4345: import de.intevation.flys.artifacts.resources.Resources; 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: @Override felix@4345: public void doOut(ArtifactAndFacet aaf, Document doc, boolean visible) { felix@4345: super.doOut(aaf, doc, visible); felix@4345: felix@4345: String name = aaf.getFacetName(); felix@4345: logger.debug("doOut: " + name); felix@4345: felix@4345: if (name.equals(EXTREME_WQ_CURVE)) { felix@4345: doExtremeCurveOut(aaf, doc, visible); felix@4345: } felix@4345: else { felix@4345: logger.warn("Unknown facet name " + name); felix@4345: return; felix@4345: } felix@4345: } felix@4345: felix@4345: felix@4345: /** Do Extreme Curve out */ felix@4345: protected void doExtremeCurveOut(ArtifactAndFacet aaf, Document doc, 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@4345: doc, 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@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 :