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: 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; tom@8267: import org.dive4elements.artifacts.CallMeta; tom@8267: tom@8267: import org.dive4elements.river.artifacts.resources.Resources; aheinecke@7591: import org.dive4elements.river.artifacts.D4EArtifact; rrenkert@8002: import org.dive4elements.river.artifacts.access.RiverAccess; 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.themes.ThemeDocument; felix@7390: felix@7390: public class BedHeightProcessor extends DefaultProcessor { felix@7390: teichmann@8202: private final static Logger log = felix@7390: Logger.getLogger(BedHeightProcessor.class); felix@7390: felix@7390: public static final String I18N_AXIS_LABEL = tom@8267: "chart.bedheight_middle.section.yaxis.label"; felix@7390: gernotbelger@8961: public final static String FACET_BED_HEIGHTS_MIN = "bedheight_min"; gernotbelger@8961: gernotbelger@8961: public final static String FACET_BED_HEIGHTS_MAX = "bedheight_min"; gernotbelger@8961: 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) { tom@8856: XYSeries series = prepareSeries( tom@8856: 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: ) { tom@8856: XYSeries series = prepareSeries( tom@8856: 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@8001: if (raw == null) { rrenkert@8001: return null; rrenkert@8001: } rrenkert@7984: if (!(raw instanceof double[][])) { teichmann@8202: log.error("Unkown datatype: " + raw.getClass().getName()); rrenkert@7984: return null; aheinecke@7705: } felix@7390: rrenkert@7984: double[][] data = (double[][])raw; tom@8696: StyledSeriesBuilder.addPoints(series, rrenkert@7984: data, rrenkert@7984: false, tom@8696: GAP_TOLERANCE); 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) gernotbelger@8961: || FACET_BED_HEIGHTS_MIN.equals(facetType) gernotbelger@8961: || FACET_BED_HEIGHTS_MAX.equals(facetType) aheinecke@7705: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT1.equals(facetType) aheinecke@7705: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT2.equals(facetType) tom@8856: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED.equals( tom@8856: facetType) tom@8856: || FacetTypes.BED_DIFFERENCE_YEAR_HEIGHT2_FILTERED.equals( tom@8856: facetType); felix@7390: } felix@7390: felix@7390: @Override felix@7390: public String getAxisLabel(DiagramGenerator generator) { aheinecke@7591: D4EArtifact flys = (D4EArtifact) generator.getMaster(); tom@8267: String unit = new RiverAccess(flys).getRiver().getWstUnit().getName(); aheinecke@7591: tom@8267: CallMeta meta = generator.getCallContext().getMeta(); aheinecke@7591: rrenkert@7892: if (yAxisLabel != null && !yAxisLabel.isEmpty()) { tom@8267: return Resources.getMsg( tom@8267: meta, rrenkert@7892: yAxisLabel, rrenkert@7892: new Object[] {unit}); rrenkert@7892: } tom@8267: return Resources.getMsg( tom@8267: meta, felix@7390: I18N_AXIS_LABEL, aheinecke@7591: new Object[] { unit }); felix@7390: } gernotbelger@8961: }