felix@7390: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde felix@7390: * Software engineering by Intevation GmbH felix@7390: * felix@7390: * This file is Free Software under the GNU AGPL (>=v3) felix@7390: * and comes with ABSOLUTELY NO WARRANTY! Check out the felix@7390: * documentation coming with Dive4Elements River for details. felix@7390: */ felix@7390: felix@7390: package org.dive4elements.river.exports.process; felix@7390: felix@7390: import java.util.List; rrenkert@7892: import java.util.Map; felix@7390: felix@7390: import org.apache.log4j.Logger; felix@7390: import org.jfree.data.xy.XYSeries; felix@7390: felix@7390: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; felix@7390: import org.dive4elements.artifacts.CallContext; aheinecke@7591: import org.dive4elements.river.artifacts.D4EArtifact; felix@7391: import org.dive4elements.river.artifacts.model.minfo.BedHeightSingleData; aheinecke@7705: import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; felix@7394: import org.dive4elements.river.artifacts.model.FacetTypes; felix@7390: import org.dive4elements.river.exports.XYChartGenerator; felix@7390: import org.dive4elements.river.exports.DiagramGenerator; aheinecke@7705: import org.dive4elements.river.exports.StyledSeriesBuilder; felix@7390: import org.dive4elements.river.jfree.StyledXYSeries; felix@7390: import org.dive4elements.river.model.BedHeightSingleValue; felix@7390: import org.dive4elements.river.themes.ThemeDocument; aheinecke@7591: import org.dive4elements.river.utils.RiverUtils; felix@7390: felix@7390: public class BedHeightProcessor extends DefaultProcessor { felix@7390: felix@7390: private final static Logger logger = felix@7390: Logger.getLogger(BedHeightProcessor.class); felix@7390: felix@7390: public static final String I18N_AXIS_LABEL_DEFAULT felix@7395: = "Sohlhoehe [m]"; felix@7390: public static final String I18N_AXIS_LABEL = felix@7395: "chart.bedheight.height.yaxis.label"; felix@7390: aheinecke@7723: protected static final double GAP_TOLERANCE = 0.101d; aheinecke@7705: rrenkert@7892: protected String yAxisLabel; rrenkert@7892: felix@7390: @Override felix@7390: public void doOut( felix@7390: DiagramGenerator generator, felix@7390: ArtifactAndFacet bundle, felix@7390: ThemeDocument theme, felix@7390: boolean visible) { felix@7390: XYSeries series = prepareSeries(bundle, theme, generator.getCallContext()); rrenkert@7984: if (series != null) { rrenkert@7984: generator.addAxisSeries(series, axisName, visible); rrenkert@7984: } felix@7390: } felix@7390: felix@7390: @Override felix@7390: public void doOut( felix@7390: XYChartGenerator generator, felix@7390: ArtifactAndFacet bundle, felix@7390: ThemeDocument theme, felix@7390: boolean visible, felix@7390: int index felix@7390: ) { felix@7390: XYSeries series = prepareSeries(bundle, theme, generator.getCallContext()); rrenkert@7984: if (series != null) { rrenkert@7984: generator.addAxisSeries(series, index, visible); rrenkert@7984: } felix@7390: } felix@7390: felix@7390: /** Prepare an series, independent of axis. */ rrenkert@7984: private XYSeries prepareSeries( rrenkert@7984: ArtifactAndFacet bundle, rrenkert@7984: ThemeDocument theme, rrenkert@7984: CallContext context rrenkert@7984: ) { rrenkert@7892: Map metaData = bundle.getFacet().getMetaData( rrenkert@7892: bundle.getArtifact(), context); rrenkert@7892: StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), felix@7390: theme); rrenkert@7892: series.putMetaData(metaData, bundle.getArtifact(), context); rrenkert@7892: yAxisLabel = metaData.get("Y"); felix@7390: rrenkert@7984: Object raw = bundle.getData(context); rrenkert@7984: if (!(raw instanceof double[][])) { rrenkert@7984: logger.error("Unkown datatype: " + raw.getClass().getName()); rrenkert@7984: return null; aheinecke@7705: } felix@7390: rrenkert@7984: double[][] data = (double[][])raw; rrenkert@7984: StyledSeriesBuilder.addPointsFactorY(series, rrenkert@7984: data, rrenkert@7984: false, rrenkert@7984: GAP_TOLERANCE, rrenkert@7984: 1d); felix@7390: return series; felix@7390: } felix@7390: felix@7390: felix@7390: @Override aheinecke@7705: public boolean canHandle(String facetType) { aheinecke@7705: return FacetTypes.BEDHEIGHT.equals(facetType) aheinecke@7705: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT1.equals(facetType) aheinecke@7705: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT2.equals(facetType) aheinecke@7705: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED.equals(facetType) aheinecke@7705: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT2_FILTERED.equals(facetType); felix@7390: } felix@7390: felix@7390: @Override felix@7390: public String getAxisLabel(DiagramGenerator generator) { aheinecke@7591: D4EArtifact flys = (D4EArtifact) generator.getMaster(); aheinecke@7591: aheinecke@7591: String unit = RiverUtils.getRiver(flys).getWstUnit().getName(); aheinecke@7591: rrenkert@7892: if (yAxisLabel != null && !yAxisLabel.isEmpty()) { rrenkert@7892: return generator.msg( rrenkert@7892: yAxisLabel, rrenkert@7892: I18N_AXIS_LABEL_DEFAULT, rrenkert@7892: new Object[] {unit}); rrenkert@7892: } felix@7390: return generator.msg( felix@7390: I18N_AXIS_LABEL, aheinecke@7591: I18N_AXIS_LABEL_DEFAULT, aheinecke@7591: new Object[] { unit }); felix@7390: } felix@7390: }