felix@6927: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde felix@6927: * Software engineering by Intevation GmbH felix@6927: * felix@6927: * This file is Free Software under the GNU AGPL (>=v3) felix@6927: * and comes with ABSOLUTELY NO WARRANTY! Check out the felix@6927: * documentation coming with Dive4Elements River for details. felix@6927: */ felix@6927: felix@6927: package org.dive4elements.river.exports.process; felix@6927: felix@6927: import org.apache.log4j.Logger; felix@6927: import org.jfree.data.xy.XYSeries; felix@6927: felix@6927: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; felix@6927: import org.dive4elements.artifacts.CallContext; felix@6927: import org.dive4elements.river.artifacts.model.FacetTypes; felix@6927: import org.dive4elements.river.artifacts.model.WKms; felix@6927: import org.dive4elements.river.artifacts.model.WQKms; felix@6927: felix@6927: import org.dive4elements.river.exports.StyledSeriesBuilder; felix@6927: import org.dive4elements.river.exports.XYChartGenerator; felix@6927: import org.dive4elements.river.jfree.StyledXYSeries; felix@6927: import org.dive4elements.river.themes.ThemeDocument; felix@6927: import org.dive4elements.river.utils.DataUtil; felix@6927: felix@6927: /** felix@6927: * Add data to chart/generator. felix@6927: * felix@6927: * @author Björn Ricks felix@6927: */ aheinecke@7057: public class QOutProcessor extends DefaultProcessor { felix@6927: felix@6927: /** Private logger. */ felix@6927: private static final Logger logger = felix@6927: Logger.getLogger(QOutProcessor.class); felix@6927: felix@6927: @Override felix@6927: public void doOut( felix@6927: XYChartGenerator generator, felix@6927: ArtifactAndFacet aaf, felix@6927: ThemeDocument theme, felix@6927: boolean visible, felix@6927: int index) felix@6927: { felix@6927: CallContext context = generator.getCallContext(); felix@6927: WQKms wqkms = (WQKms) aaf.getData(context); felix@6927: felix@6927: doQOut(generator, wqkms, aaf, theme, visible, index); felix@6927: } felix@6927: felix@6927: /** felix@6927: * Returns true if facettype is q-type. felix@6927: */ felix@6927: @Override felix@6927: public boolean canHandle(String facetType) { felix@6927: if (facetType == null) { felix@6927: return false; felix@6927: } felix@6927: felix@6927: if (facetType.equals(FacetTypes.STATIC_WQKMS_Q) felix@6929: || facetType.equals(FacetTypes.LONGITUDINAL_Q) felix@6929: || facetType.equals(FacetTypes.DISCHARGE_LONGITUDINAL_Q)) { felix@6927: return true; felix@6927: } felix@6927: return false; felix@6927: } felix@6927: felix@6927: felix@6927: /** felix@6927: * Process the output for Q facets in a longitudinal section curve. felix@6927: * felix@6927: * @param generator Generator to use. felix@6927: * @param wqkms An array of WQKms values. felix@6927: * @param aandf The facet and artifact. This facet does NOT support any data objects. Use felix@6927: * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports felix@6927: * data. felix@6927: * @param theme The theme that contains styling information. felix@6927: * @param visible The visibility of the curve. felix@6927: * @param index Axis index to add data to. felix@6927: */ felix@6927: protected void doQOut( felix@6927: XYChartGenerator generator, felix@6927: WQKms wqkms, felix@6927: ArtifactAndFacet aaf, felix@6927: ThemeDocument theme, felix@6927: boolean visible, felix@6927: int index felix@6927: ) { felix@6927: logger.debug("QProcessor.doOut"); felix@6927: felix@6927: XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme); felix@6927: felix@6927: StyledSeriesBuilder.addStepPointsKmQ(series, wqkms); felix@6927: felix@6927: generator.addAxisSeries(series, index, visible); felix@6927: felix@6927: invertAxis(generator, wqkms); felix@6927: } felix@6927: felix@6927: /** felix@6927: * This method determines - taking JFreeCharts auto x value ordering into felix@6927: * account - if the x axis need to be inverted. Waterlines in these charts felix@6927: * should decrease. felix@6927: * felix@6927: * @param generator the generator to invert the axis or not. felix@6927: * @param wkms The data object that stores the x and y values used for this felix@6927: * chart. felix@6927: */ felix@6927: public void invertAxis(XYChartGenerator generator, WKms wkms) { felix@6927: boolean wsUp = wkms.guessWaterIncreasing(); felix@6927: boolean kmUp = DataUtil.guessWaterIncreasing(wkms.allKms()); felix@6927: int size = wkms.size(); felix@6927: boolean inv = ((wsUp && kmUp) || (!wsUp && !kmUp)) && size > 1; felix@6927: felix@6927: if (logger.isDebugEnabled()) { felix@6927: logger.debug("(Wkms)Values : " + size); felix@6927: if (size > 0) { felix@6927: logger.debug("Start km: " + wkms.getKm(0)); felix@6927: logger.debug("End km: " + wkms.getKm(size-1)); felix@6927: } felix@6927: logger.debug("wsUp: " + wsUp); felix@6927: logger.debug("kmUp: " + kmUp); felix@6927: if (size == 1) { felix@6927: logger.debug("InvertAxis not inverting because we have just one km"); felix@6927: } felix@6927: logger.debug("inv: " + inv); felix@6927: } felix@6927: generator.setInverted(inv); felix@6927: } felix@6927: } felix@6927: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :