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; 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@7705: protected static double GAP_TOLERANCE = 0.101d; aheinecke@7705: 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()); felix@7390: generator.addAxisSeries(series, axisName, visible); 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()); felix@7390: generator.addAxisSeries(series, index, visible); felix@7390: } felix@7390: felix@7390: /** Prepare an series, independent of axis. */ felix@7390: private XYSeries prepareSeries(ArtifactAndFacet bundle, felix@7390: ThemeDocument theme, CallContext context) { felix@7390: Object data = bundle.getData(context); felix@7390: XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), felix@7390: theme); aheinecke@7705: if (data instanceof BedDiffYearResult) { aheinecke@7705: BedDiffYearResult bData = (BedDiffYearResult) data; aheinecke@7705: aheinecke@7705: double[][] points; aheinecke@7705: String facetType = bundle.getFacetName(); aheinecke@7705: aheinecke@7705: if (FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT1.equals(facetType) || aheinecke@7705: FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED.equals(facetType)) { aheinecke@7705: points = bData.getHeights1Data(); aheinecke@7705: } else { aheinecke@7705: points = bData.getHeights2Data(); aheinecke@7705: } aheinecke@7705: StyledSeriesBuilder.addPointsFactorY(series, aheinecke@7705: points, aheinecke@7705: false, aheinecke@7705: GAP_TOLERANCE, aheinecke@7705: 1d); aheinecke@7705: } else if (data instanceof BedHeightSingleData) { felix@7391: BedHeightSingleData bData = (BedHeightSingleData)data; felix@7396: double[] heights = bData.getHeights(); felix@7390: double[] stations = bData.getStations().toNativeArray(); felix@7390: felix@7390: logger.debug("doBedheightSingleOut"); felix@7390: felix@7396: for (int i = 0; i < heights.length; i++) { felix@7396: series.add(stations[i], heights[i], false); felix@7390: } aheinecke@7705: } aheinecke@7705: else if (data instanceof List) { felix@7390: List bData = (List)data; felix@7390: felix@7390: logger.debug("doBedheightSingleValueOut"); felix@7390: felix@7390: for(BedHeightSingleValue bvalue: bData) { felix@7396: series.add(bvalue.getStation(), bvalue.getHeight()); felix@7390: } felix@7390: } felix@7390: else { felix@7390: logger.error("Unknown data type " + data.getClass()); felix@7390: } 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: 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: }