teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.exports.minfo; ingo@3757: ingo@3757: import org.apache.log4j.Logger; ingo@3757: import org.jfree.data.xy.XYSeries; ingo@3757: teichmann@5831: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; teichmann@5831: import org.dive4elements.artifactdatabase.state.Facet; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; rrenkert@6252: import org.dive4elements.river.artifacts.model.minfo.BedDiameterData; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedDiameterResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedParametersResult; teichmann@5831: import org.dive4elements.river.artifacts.model.minfo.BedloadDiameterResult; teichmann@5831: import org.dive4elements.river.exports.StyledSeriesBuilder; teichmann@5831: import org.dive4elements.river.exports.XYChartGenerator; teichmann@5864: import org.dive4elements.river.jfree.RiverAnnotation; teichmann@5831: import org.dive4elements.river.jfree.StyledXYSeries; teichmann@6905: import org.dive4elements.river.themes.ThemeDocument; ingo@3757: ingo@3757: ingo@3757: /** ingo@3757: * An OutGenerator that generates bed quality charts. sascha@3772: * ingo@3757: * @author Ingo Weinzierl ingo@3757: */ ingo@3757: public class BedQualityGenerator extends XYChartGenerator implements FacetTypes { ingo@3757: ingo@3757: public enum YAXIS { ingo@3757: W(0), P(1), D(2); ingo@3757: ingo@3757: protected int idx; ingo@3757: ingo@3757: private YAXIS(int c) { ingo@3757: idx = c; ingo@3757: } ingo@3757: } ingo@3757: ingo@3757: /** The logger that is used in this generator. */ ingo@3757: private static Logger logger = Logger.getLogger(BedQualityGenerator.class); ingo@3757: ingo@3757: public static final String I18N_CHART_TITLE = "chart.bedquality.title"; ingo@3757: public static final String I18N_XAXIS_LABEL = "chart.bedquality.xaxis.label"; ingo@3757: public static final String I18N_YAXIS_LABEL = "chart.bedquality.yaxis.label"; ingo@3757: public static final String I18N_SECOND_YAXIS_LABEL = "chart.bedquality.yaxis.label.porosity"; ingo@3757: public static final String I18N_THIRD_YAXIS_LABEL = "chart.bedquality.yaxis.label.diameter"; ingo@3757: ingo@3757: public static final String I18N_CHART_TITLE_DEFAULT = "Sohlen Längsschnitt"; ingo@3757: public static final String I18N_XAXIS_LABEL_DEFAULT = "Fluss-Km"; rrenkert@4643: public static final String I18N_YAXIS_LABEL_DEFAULT = "Durchmesser [mm]"; ingo@3757: public static final String I18N_SECOND_YAXIS_LABEL_DEFAULT = "Porosität [%]"; ingo@3757: public static final String I18N_THIRD_YAXIS_LABEL_DEFAULT = "Dichte [t/m^3]"; ingo@3757: ingo@3757: @Override ingo@3757: protected YAxisWalker getYAxisWalker() { ingo@3757: return new YAxisWalker() { ingo@3757: ingo@3757: @Override ingo@3757: public int length() { ingo@3757: return YAXIS.values().length; ingo@3757: } ingo@3757: ingo@3757: @Override ingo@3757: public String getId(int idx) { ingo@3757: YAXIS[] yaxes = YAXIS.values(); ingo@3757: return yaxes[idx].toString(); ingo@3757: } ingo@3757: }; ingo@3757: } ingo@3757: ingo@3757: /** ingo@3757: * Returns the default title for this chart. sascha@3772: * ingo@3757: * @return the default title for this chart. ingo@3757: */ ingo@3757: @Override ingo@3757: public String getDefaultChartTitle() { ingo@3757: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); ingo@3757: } ingo@3757: ingo@3757: /** ingo@3757: * Get internationalized label for the x axis. ingo@3757: */ ingo@3757: @Override ingo@3757: protected String getDefaultXAxisLabel() { felix@6166: return msg(I18N_XAXIS_LABEL, felix@6166: I18N_XAXIS_LABEL_DEFAULT, felix@6166: new Object[] {getRiverName()}); ingo@3757: } ingo@3757: ingo@3757: @Override ingo@3757: protected String getDefaultYAxisLabel(int index) { ingo@3757: String label = "default"; ingo@3757: ingo@3757: if (index == YAXIS.W.idx) { ingo@3757: label = getWAxisLabel(); ingo@3757: } ingo@3757: else if (index == YAXIS.P.idx) { ingo@3757: label = getPAxisLabel(); ingo@3757: } ingo@3757: else if (index == YAXIS.D.idx) { ingo@3757: label = getDAxisLabel(); ingo@3757: } ingo@3757: ingo@3757: return label; ingo@3757: } ingo@3757: ingo@3757: /** ingo@3757: * Get internationalized label for the y axis displaying the diameter. ingo@3757: */ ingo@3757: protected String getWAxisLabel() { ingo@3757: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); ingo@3757: } ingo@3757: ingo@3757: /** ingo@3757: * Get internationalized label for the y axis displaying the porosity. ingo@3757: */ ingo@3757: protected String getPAxisLabel() { ingo@3757: return msg(I18N_SECOND_YAXIS_LABEL, I18N_SECOND_YAXIS_LABEL_DEFAULT); ingo@3757: } ingo@3757: ingo@3757: /** ingo@3757: * Get internationalized label for the y axis displaying the density. ingo@3757: */ ingo@3757: protected String getDAxisLabel() { ingo@3757: return msg(I18N_THIRD_YAXIS_LABEL, I18N_THIRD_YAXIS_LABEL_DEFAULT); ingo@3757: } ingo@3757: ingo@3757: /** ingo@3757: * Produce output. sascha@3772: * ingo@3757: * @param artifactAndFacet ingo@3757: * current facet. ingo@3757: * @param attr ingo@3757: * theme for facet ingo@3757: */ felix@6783: @Override teichmann@6905: public void doOut( teichmann@6905: ArtifactAndFacet artifactAndFacet, teichmann@6905: ThemeDocument attr, teichmann@6905: boolean visible teichmann@6905: ) { ingo@3757: String name = artifactAndFacet.getFacetName(); ingo@3757: ingo@3757: logger.debug("BedQualityGenerator.doOut: " + name); ingo@3757: ingo@3757: if (name == null) { ingo@3757: logger.error("No facet name for doOut(). No output generated!"); ingo@3757: return; ingo@3757: } ingo@3757: ingo@3757: Facet facet = artifactAndFacet.getFacet(); ingo@3757: ingo@3757: if (facet == null) { ingo@3757: return; ingo@3757: } ingo@3757: ingo@3766: // TODO BED_QUALITY_BED_DIAMETER_TOPLAYER ingo@3766: if (name.equals(BED_QUALITY_BED_DIAMETER_TOPLAYER)) { ingo@3766: doBedDiameterTopLayerOut( ingo@3784: (BedDiameterResult) artifactAndFacet.getData(context), ingo@3757: artifactAndFacet, attr, visible); ingo@3757: } ingo@3766: else if (name.equals(BED_QUALITY_BED_DIAMETER_SUBLAYER)) { ingo@3766: doBedDiameterSubLayerOut( ingo@3784: (BedDiameterResult) artifactAndFacet.getData(context), ingo@3766: artifactAndFacet, attr, visible); ingo@3766: } ingo@3766: // TODO BED_QUALITY_BED_DIAMETER_SUBLAYER ingo@3757: else if (name.equals(BED_QUALITY_BEDLOAD_DIAMETER)) { ingo@3766: doBedLoadDiameterOut( ingo@3784: (BedloadDiameterResult) artifactAndFacet.getData(context), ingo@3757: artifactAndFacet, attr, visible); ingo@3757: } ingo@3766: else if (name.equals(BED_QUALITY_POROSITY_TOPLAYER)) { ingo@3766: doPorosityTopLayerOut( ingo@3784: (BedParametersResult) artifactAndFacet.getData(context), ingo@3757: artifactAndFacet, attr, visible); ingo@3757: } ingo@3766: else if (name.equals(BED_QUALITY_POROSITY_SUBLAYER)) { ingo@3766: doPorositySubLayerOut( ingo@3784: (BedParametersResult) artifactAndFacet.getData(context), ingo@3766: artifactAndFacet, attr, visible); ingo@3766: } ingo@3766: else if (name.equals(BED_QUALITY_SEDIMENT_DENSITY_TOPLAYER)) { ingo@3766: doDensityTopLayerOut( ingo@3784: (BedParametersResult) artifactAndFacet.getData(context), ingo@3766: artifactAndFacet, attr, visible); ingo@3766: } ingo@3766: else if (name.equals(BED_QUALITY_SEDIMENT_DENSITY_SUBLAYER)) { ingo@3766: doDensitySubLayerOut( ingo@3784: (BedParametersResult) artifactAndFacet.getData(context), ingo@3757: artifactAndFacet, attr, visible); ingo@3757: } rrenkert@6252: else if (name.equals(BED_DIAMETER_DATA_TOP) || rrenkert@6262: name.equals(BED_DIAMETER_DATA_SUB) || rrenkert@6262: name.equals(BEDLOAD_DIAMETER_DATA)) { rrenkert@6252: doBedDiameterDataOut( rrenkert@6252: (BedDiameterData) artifactAndFacet.getData(context), rrenkert@6252: artifactAndFacet, attr, visible); rrenkert@6252: } rrenkert@5591: else if (name.equals(LONGITUDINAL_ANNOTATION)) { rrenkert@5591: doAnnotations( teichmann@5864: (RiverAnnotation) artifactAndFacet.getData(context), rrenkert@5591: artifactAndFacet, rrenkert@5591: attr, rrenkert@5591: visible); rrenkert@5591: } ingo@3757: else if (FacetTypes.IS.MANUALPOINTS(name)) { ingo@3757: doPoints(artifactAndFacet.getData(context), artifactAndFacet, attr, ingo@3757: visible, YAXIS.W.idx); ingo@3757: } ingo@3757: else { ingo@3757: logger.warn("Unknown facet name: " + name); ingo@3757: return; ingo@3757: } ingo@3757: } ingo@3757: rrenkert@6252: private void doBedDiameterDataOut( rrenkert@6252: BedDiameterData data, rrenkert@6252: ArtifactAndFacet aandf, teichmann@6905: ThemeDocument theme, rrenkert@6252: boolean visible rrenkert@6252: ) { rrenkert@6252: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); felix@6854: StyledSeriesBuilder.addPoints(series, data.getDiameterData(), true); rrenkert@6252: rrenkert@6252: addAxisSeries(series, YAXIS.W.idx, visible); rrenkert@6252: } rrenkert@6252: ingo@3784: protected void doBedDiameterTopLayerOut(BedDiameterResult data, teichmann@6905: ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) { ingo@3766: logger.debug("BedQuality.doBedDiameterTopLayerOut"); ingo@3757: ingo@3757: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); felix@6854: StyledSeriesBuilder.addPoints(series, data.getDiameterCapData(), true); ingo@3757: ingo@3757: addAxisSeries(series, YAXIS.W.idx, visible); ingo@3757: } ingo@3757: ingo@3784: protected void doBedDiameterSubLayerOut(BedDiameterResult data, teichmann@6905: ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) { ingo@3766: logger.debug("BedQuality.doBedDiameterSubLayerOut"); ingo@3757: ingo@3757: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); felix@6854: StyledSeriesBuilder.addPoints(series, data.getDiameterSubData(), true); ingo@3757: ingo@3757: addAxisSeries(series, YAXIS.W.idx, visible); ingo@3757: } ingo@3757: ingo@3784: protected void doBedLoadDiameterOut(BedloadDiameterResult data, teichmann@6905: ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) { ingo@3766: logger.debug("BedQuality.doBedLoadDiameterOut"); ingo@3766: ingo@3766: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); felix@6854: StyledSeriesBuilder.addPoints(series, data.getDiameterData(), true); ingo@3766: ingo@3766: addAxisSeries(series, YAXIS.W.idx, visible); ingo@3766: } ingo@3766: ingo@3784: protected void doPorosityTopLayerOut(BedParametersResult data, teichmann@6905: ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) { ingo@3766: logger.debug("BedQuality.doPorosityTopLayerOut"); ingo@3757: ingo@3757: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); ingo@3757: ingo@3784: StyledSeriesBuilder.addPoints(series, data.getPorosityCapData(), felix@6854: true); ingo@3757: ingo@3757: addAxisSeries(series, YAXIS.P.idx, visible); ingo@3757: } ingo@3757: ingo@3784: protected void doPorositySubLayerOut(BedParametersResult data, teichmann@6905: ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) { ingo@3766: logger.debug("BedQuality.doPorositySubLayerOut"); ingo@3766: ingo@3766: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); ingo@3766: ingo@3784: StyledSeriesBuilder.addPoints(series, data.getPorositySubData(), felix@6854: true); ingo@3766: ingo@3766: addAxisSeries(series, YAXIS.P.idx, visible); ingo@3766: } ingo@3766: ingo@3784: protected void doDensityTopLayerOut(BedParametersResult data, teichmann@6905: ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) { ingo@3757: logger.debug("BedQuality.doDensityOut"); ingo@3757: ingo@3757: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); ingo@3757: ingo@3784: StyledSeriesBuilder.addPoints(series, data.getDensityCapData(), felix@6854: true); ingo@3766: ingo@3766: addAxisSeries(series, YAXIS.D.idx, visible); ingo@3766: } ingo@3766: ingo@3784: protected void doDensitySubLayerOut(BedParametersResult data, teichmann@6905: ArtifactAndFacet aandf, ThemeDocument theme, boolean visible) { ingo@3766: logger.debug("BedQuality.doDensityOut"); ingo@3766: ingo@3766: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); ingo@3766: ingo@3784: StyledSeriesBuilder.addPoints(series, data.getDensitySubData(), felix@6854: true); ingo@3757: ingo@3757: addAxisSeries(series, YAXIS.D.idx, visible); ingo@3757: } ingo@3757: } ingo@3757: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :