Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/exports/CrossSectionGenerator.java @ 2058:f97cf2e350c9
Some refactoring done: all Sections subclass TypeSection now to be able to use the convinience methods for string, integer, double and boolean attributes.
flys-artifacts/trunk@3550 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 27 Dec 2011 11:37:23 +0000 |
parents | c7f18fa0d685 |
children | ca8997aa683e |
line wrap: on
line source
package de.intevation.flys.exports; import java.util.List; import org.apache.log4j.Logger; import org.jfree.chart.JFreeChart; import org.jfree.chart.title.TextTitle; import org.jfree.data.xy.XYSeries; import org.w3c.dom.Document; import de.intevation.artifactdatabase.state.ArtifactAndFacet; import de.intevation.flys.artifacts.WINFOArtifact; import de.intevation.flys.model.CrossSectionLine; import de.intevation.flys.artifacts.model.FacetTypes; import de.intevation.flys.artifacts.model.CrossSectionFacet; import de.intevation.artifacts.DataProvider; /** * An OutGenerator that generates cross section graphs. */ public class CrossSectionGenerator extends XYChartGenerator implements FacetTypes { /** The logger that is used in this generator. */ private static Logger logger = Logger.getLogger(CrossSectionGenerator.class); public static final String I18N_CHART_TITLE = "chart.cross_section.title"; public static final String I18N_CHART_SUBTITLE = "chart.cross_section.subtitle"; public static final String I18N_XAXIS_LABEL = "chart.cross_section.xaxis.label"; public static final String I18N_YAXIS_LABEL = "chart.cross_section.yaxis.label"; public static final String I18N_CHART_TITLE_DEFAULT = "Querprofildiagramm"; public static final String I18N_XAXIS_LABEL_DEFAULT = "Abstand [m]"; public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]"; /** Trivial Constructor. */ public CrossSectionGenerator() { super(); } @Override protected YAxisWalker getYAxisWalker() { return new YAxisWalker() { @Override public int length() { return 1; } /** Get identifier for this index. */ @Override public String getId(int idx) { return "W"; } }; } /** * Get localized chart title. */ @Override protected String getDefaultChartTitle() { Object[] i18n_msg_args = new Object[] { getRiverName() }; return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT, i18n_msg_args); } @Override protected String getChartSubtitle() { // XXX NOTE: overriding this method disables ChartSettings subtitle! return getDefaultChartSubtitle(); } @Override protected String getDefaultChartSubtitle() { List<DataProvider> providers = context.getDataProvider(CrossSectionFacet.BLACKBOARD_CS_MASTER_DATA); double km = 0d; if (providers.size() > 0) { CrossSectionLine csl = (CrossSectionLine) providers.get(0). provideData(CrossSectionFacet.BLACKBOARD_CS_MASTER_DATA, null, context); km = csl.getKm().doubleValue(); } Object[] args = new Object[] { getRiverName(), km }; return msg(I18N_CHART_SUBTITLE, "", args); } @Override protected void addSubtitles(JFreeChart chart) { String subtitle = getChartSubtitle(); chart.addSubtitle(new TextTitle(subtitle)); } @Override protected String getDefaultXAxisLabel() { return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); } @Override protected String getDefaultYAxisLabel(int pos) { return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); } /** * Let one facet do its job. */ public void doOut( ArtifactAndFacet artifactFacet, Document attr, boolean visible ) { String name = artifactFacet.getFacetName(); logger.debug("CrossSectionGenerator.doOut: " + name); if (name == null) { logger.error("No facet name for doOut(). No output generated!"); return; } if (name.equals(CROSS_SECTION)) { doCrossSectionOut( artifactFacet.getData(context), artifactFacet.getFacetDescription(), attr, visible); } else if (name.equals(CROSS_SECTION_WATER_LINE)) { doCrossSectionWaterLineOut( artifactFacet.getData(context), artifactFacet.getFacetDescription(), attr, visible); } else if (FacetTypes.IS.AREA(name)) { doArea(artifactFacet.getData(context), artifactFacet.getFacetDescription(), attr, visible); } else { logger.warn("CrossSection.doOut: Unknown facet name: " + name); return; } } /** * Do Area out. */ protected void doArea( Object o, String seriesName, Document theme, boolean visible ) { logger.debug("CrossSectionGenerator.doArea"); StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(theme); // TODO make this more stable. Object[] doubles = (Object[]) o; XYSeries up = null; XYSeries down = null; if (doubles[1] != null) { up = new StyledXYSeries(seriesName, false, theme); StyledSeriesBuilder.addPoints(up, (double [][]) doubles[1]); } if (doubles[0] != null) { // TODO: Sort this out: when the two series have the same name, // the renderer (or anything in between) will not work correctly. down = new StyledXYSeries(seriesName + " ", false, theme); StyledSeriesBuilder.addPoints(down, (double [][]) doubles[0]); } if (up == null && down != null) { area.setMode(StyledAreaSeriesCollection.FILL_MODE.ABOVE); down.setKey(seriesName); area.addSeries(down); } else if (up != null && down == null) { area.setMode(StyledAreaSeriesCollection.FILL_MODE.UNDER); area.addSeries(up); } else if (up != null && down != null) { if (doubles[2] != null && ((Boolean)doubles[2]).booleanValue()) { area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN); } else { area.setMode(StyledAreaSeriesCollection.FILL_MODE.ABOVE); } area.addSeries(up); area.addSeries(down); } addAreaSeries(area, 0, visible); } /** * Do cross sections waterline out. * * @param seriesName name of the data (line) to display in legend. * @param theme Theme for the data series. */ protected void doCrossSectionWaterLineOut( Object o, String seriesName, Document theme, boolean visible ) { logger.debug("CrossSectionGenerator.doCrossSectionWaterLineOut"); // DO NOT SORT DATA! This destroys the gaps indicated by NaNs XYSeries series = new StyledXYSeries(seriesName, false, theme); StyledSeriesBuilder.addPoints(series, (double [][]) o); addAxisSeries(series, 0, visible); } /** * Do cross sections out. * * @param seriesName name of the data (line) to display in legend. * @param theme Theme for the data series. */ protected void doCrossSectionOut( Object o, String seriesName, Document theme, boolean visible ) { logger.debug("CrossSectionGenerator.doCrossSectionOut"); XYSeries series = new StyledXYSeries(seriesName, theme); StyledSeriesBuilder.addPoints(series, (double [][]) o); addAxisSeries(series, 0, visible); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :