mschaefer@9202: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9202: * Software engineering by mschaefer@9202: * Björnsen Beratende Ingenieure GmbH mschaefer@9202: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9202: * mschaefer@9202: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9202: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9202: * documentation coming with Dive4Elements River for details. mschaefer@9202: */ mschaefer@9202: gernotbelger@9215: package org.dive4elements.river.artifacts.sinfo.flood_duration; mschaefer@9202: mschaefer@9202: import java.util.HashSet; mschaefer@9202: import java.util.Set; mschaefer@9202: gernotbelger@9203: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; mschaefer@9202: import org.dive4elements.artifactdatabase.state.Facet; mschaefer@9202: import org.dive4elements.artifacts.CallContext; mschaefer@9202: import org.dive4elements.river.artifacts.common.AbstractCalculationResult; gernotbelger@9347: import org.dive4elements.river.artifacts.common.AbstractProcessor; mschaefer@9202: import org.dive4elements.river.artifacts.resources.Resources; gernotbelger@9215: import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; gernotbelger@9208: import org.dive4elements.river.artifacts.sinfo.flood_duration.FloodDurationCalculationResult.ValueGetter; mschaefer@9202: import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; gernotbelger@9203: import org.dive4elements.river.exports.DiagramGenerator; mschaefer@9229: import org.dive4elements.river.model.Attribute.AttributeKey; gernotbelger@9203: import org.dive4elements.river.themes.ThemeDocument; mschaefer@9202: mschaefer@9202: /** mschaefer@9202: * Processor to generate the facet and data series of infrastructure flood heights mschaefer@9202: * mschaefer@9202: * @author Matthias Schäfer mschaefer@9202: * mschaefer@9202: */ gernotbelger@9347: public final class FloodHeightProcessor extends AbstractProcessor { mschaefer@9202: mschaefer@9229: private static final String FACET_FLOOD_HEIGHT_LEFT = "sinfo_facet_flood_height.left"; mschaefer@9229: mschaefer@9229: private static final String FACET_FLOOD_HEIGHT_RIGHT = "sinfo_facet_flood_height.right"; mschaefer@9202: d@9612: private static final String FACET_MAIN_VALUE_HEIGHT_DESCRIPTION = "mainvalue.w.description"; mschaefer@9202: gernotbelger@9205: private static final String FACET_MAIN_VALUE_HEIGHT = "mainvalue.w"; mschaefer@9202: mschaefer@9297: private static final String I18N_AXIS_LABEL = "sinfo.chart.flood_duration.height.section.yaxis.label"; mschaefer@9202: mschaefer@9202: private static final Set HANDLED_FACET_TYPES = new HashSet<>(); mschaefer@9202: mschaefer@9202: static { mschaefer@9229: HANDLED_FACET_TYPES.add(FACET_FLOOD_HEIGHT_LEFT); mschaefer@9229: HANDLED_FACET_TYPES.add(FACET_FLOOD_HEIGHT_RIGHT); gernotbelger@9205: HANDLED_FACET_TYPES.add(FACET_MAIN_VALUE_HEIGHT); mschaefer@9202: } mschaefer@9202: mschaefer@9202: public FloodHeightProcessor() { mschaefer@9202: super(I18N_AXIS_LABEL, HANDLED_FACET_TYPES); mschaefer@9202: } mschaefer@9202: gernotbelger@9203: public static Facet createFloodHeightFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result, mschaefer@9620: final int facetIndex, final int resultIndex, final FloodDurationInfrastructureChoice infrastructure) { mschaefer@9229: d@9612: final String facetName = infrastructure.getRiverside().equals(AttributeKey.LEFT) ? FACET_FLOOD_HEIGHT_LEFT : FACET_FLOOD_HEIGHT_RIGHT; d@9612: final String description = infrastructure.getFloodHeightLabel(context); d@9612: return new InfrastructureResultFacet(facetIndex, resultIndex, facetName, description, I18N_AXIS_LABEL, id, hash, infrastructure); mschaefer@9202: } mschaefer@9202: gernotbelger@9203: public static Facet createMainValueHeightFacet(final CallContext context, final String hash, final String id, final FloodDurationCalculationResult result, gernotbelger@9205: final int facetIndex, final int resultIndex, final int dataIndex) { mschaefer@9202: final String description = Resources.getMsg(context.getMeta(), FACET_MAIN_VALUE_HEIGHT_DESCRIPTION, FACET_MAIN_VALUE_HEIGHT_DESCRIPTION, mschaefer@9285: result.getWaterlevelLabel(dataIndex)); gernotbelger@9205: gernotbelger@9215: return new FloodDurationFacet(facetIndex, resultIndex, dataIndex, FACET_MAIN_VALUE_HEIGHT, description, ComputeType.ADVANCE, I18N_AXIS_LABEL, hash, id); mschaefer@9202: } gernotbelger@9203: gernotbelger@9203: @Override gernotbelger@9203: protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { gernotbelger@9203: gernotbelger@9205: final String facetName = bundle.getFacetName(); gernotbelger@9205: d@9612: if (FACET_FLOOD_HEIGHT_LEFT.contentEquals(facetName) || FACET_FLOOD_HEIGHT_RIGHT.contentEquals(facetName)) d@9612: return buildInfrastructureSeries(generator, bundle, theme, visible); gernotbelger@9205: gernotbelger@9205: if (FACET_MAIN_VALUE_HEIGHT.contentEquals(facetName)) { gernotbelger@9208: gernotbelger@9208: final AbstractCalculationResult data = getResult(generator, bundle); gernotbelger@9208: gernotbelger@9215: final FloodDurationFacet facet = (FloodDurationFacet) bundle.getFacet(); gernotbelger@9215: final int index = facet.getWaterlevelIndex(); gernotbelger@9215: gernotbelger@9208: if (data instanceof FloodDurationCalculationResult) { gernotbelger@9208: final FloodDurationCalculationResult.ValueGetter valuegetter = new ValueGetter() { gernotbelger@9208: @Override gernotbelger@9208: public double getValue(final DurationWaterlevel waterlevel) { gernotbelger@9208: return waterlevel.getWaterlevel(); gernotbelger@9208: } gernotbelger@9208: }; gernotbelger@9265: final double[][] points = ((FloodDurationCalculationResult) data).getMainValueDurationPoints(valuegetter, index); gernotbelger@9347: return buildSeriesForPoints(points, generator, bundle, theme, visible, null); gernotbelger@9208: } gernotbelger@9205: } gernotbelger@9205: gernotbelger@9205: final String error = String.format("Unknown facet name: %s", facetName); gernotbelger@9205: throw new UnsupportedOperationException(error); gernotbelger@9203: } mschaefer@9229: d@9612: private String buildInfrastructureSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, d@9612: final boolean visible) { d@9612: d@9612: final InfrastructureResultFacet infFacet = (InfrastructureResultFacet) bundle.getFacet(); mschaefer@9620: final FloodDurationInfrastructureChoice infrastructure = infFacet.getInfrastructure(); mschaefer@9229: mschaefer@9229: final FloodDurationCalculationResult data = (FloodDurationCalculationResult) getResult(generator, bundle); mschaefer@9229: d@9612: final double[][] points = data.getInfrastructurePoints(SInfoResultType.infrastructureHeight, infrastructure); mschaefer@9229: gernotbelger@9347: return buildSeriesForPoints(points, generator, bundle, theme, visible, null); mschaefer@9229: } mschaefer@9202: }