rrenkert@8188: package org.dive4elements.river.exports.process; rrenkert@8188: rrenkert@8188: import org.apache.log4j.Logger; rrenkert@8188: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; rrenkert@8188: import org.dive4elements.artifacts.CallContext; rrenkert@8188: import org.dive4elements.river.artifacts.model.FacetTypes; rrenkert@8188: import org.dive4elements.river.artifacts.model.WQKms; rrenkert@8188: import org.dive4elements.river.exports.DiagramGenerator; rrenkert@8188: import org.dive4elements.river.exports.StyledSeriesBuilder; rrenkert@8188: import org.dive4elements.river.jfree.StyledXYSeries; rrenkert@8188: import org.dive4elements.river.themes.ThemeDocument; rrenkert@8188: import org.jfree.data.xy.XYSeries; rrenkert@8188: rrenkert@8188: rrenkert@8188: public class HistoricalDischargeProcessor rrenkert@8188: extends DefaultProcessor rrenkert@8188: implements FacetTypes rrenkert@8188: { rrenkert@8188: rrenkert@8188: private final static Logger logger = rrenkert@8188: Logger.getLogger(HistoricalDischargeProcessor.class); rrenkert@8188: rrenkert@8188: /** Station for which the diagram is shown. */ rrenkert@8188: private double km; rrenkert@8188: rrenkert@8188: /** Tolerance for comparison of kilometers. */ rrenkert@8188: public static final double KM_EPSILON = 0.001d; rrenkert@8188: rrenkert@8188: rrenkert@8188: /** This processor needs to be constructed with a given km. */ rrenkert@8188: public HistoricalDischargeProcessor() { rrenkert@8188: km = Double.NaN; rrenkert@8188: } rrenkert@8188: rrenkert@8188: rrenkert@8188: public HistoricalDischargeProcessor(double km) { rrenkert@8188: this.km = km; rrenkert@8188: } rrenkert@8188: rrenkert@8188: rrenkert@8188: /** Process data, add it to plot. */ rrenkert@8188: @Override rrenkert@8188: public void doOut( rrenkert@8188: DiagramGenerator generator, rrenkert@8188: ArtifactAndFacet bundle, rrenkert@8188: ThemeDocument theme, rrenkert@8188: boolean visible rrenkert@8188: ) { rrenkert@8188: logger.debug("do out: " + bundle.getFacetName()); rrenkert@8188: CallContext context = generator.getCallContext(); rrenkert@8188: Object data = bundle.getData(context); rrenkert@8188: if (data instanceof WQKms) { rrenkert@8188: doDischargeOut(generator, bundle, theme, visible); rrenkert@8188: } rrenkert@8188: } rrenkert@8188: rrenkert@8188: /** True if this processor knows how to deal with facetType. */ rrenkert@8188: @Override rrenkert@8188: public boolean canHandle(String facetType) { rrenkert@8188: return HISTORICAL_DISCHARGE_WQ_CURVE.equals(facetType); rrenkert@8188: } rrenkert@8188: rrenkert@8188: rrenkert@8188: /** The station of the current calculation/view. */ rrenkert@8188: protected double getKm() { rrenkert@8188: return km; rrenkert@8188: } rrenkert@8188: rrenkert@8188: /** rrenkert@8188: * Add series with discharge curve to diagram. rrenkert@8188: */ rrenkert@8188: protected void doDischargeOut( rrenkert@8188: DiagramGenerator generator, rrenkert@8188: ArtifactAndFacet bundle, rrenkert@8188: ThemeDocument theme, rrenkert@8188: boolean visible rrenkert@8188: ) { rrenkert@8188: CallContext context = generator.getCallContext(); rrenkert@8188: WQKms data = (WQKms)bundle.getData(context); rrenkert@8188: XYSeries series = new StyledXYSeries(bundle.getFacetName(), theme); rrenkert@8188: double[][] wqData = new double[2][data.size()]; rrenkert@8188: for (int i = 0; i < data.size(); i++) { rrenkert@8188: wqData[0][i] = data.getQ(i); rrenkert@8188: wqData[1][i] = data.getW(i); rrenkert@8188: } rrenkert@8188: StyledSeriesBuilder.addPoints(series, wqData, false); rrenkert@8188: rrenkert@8188: generator.addAxisSeries(series, axisName, visible); rrenkert@8188: } rrenkert@8188: }