mschaefer@9432: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@9432: * Software engineering by mschaefer@9432: * Björnsen Beratende Ingenieure GmbH mschaefer@9432: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@9432: * mschaefer@9432: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@9432: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@9432: * documentation coming with Dive4Elements River for details. mschaefer@9432: */ mschaefer@9432: mschaefer@9432: package org.dive4elements.river.artifacts.bundu.bezugswst; mschaefer@9432: mschaefer@9432: import java.util.HashSet; mschaefer@9432: import java.util.Set; mschaefer@9432: mschaefer@9432: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; mschaefer@9432: import org.dive4elements.artifactdatabase.state.Facet; mschaefer@9432: import org.dive4elements.artifacts.CallContext; mschaefer@9432: import org.dive4elements.river.artifacts.bundu.BunduResultType; mschaefer@9432: import org.dive4elements.river.artifacts.common.AbstractProcessor; mschaefer@9432: import org.dive4elements.river.artifacts.common.AbstractResultType; mschaefer@9432: import org.dive4elements.river.artifacts.resources.Resources; mschaefer@9432: import org.dive4elements.river.exports.DiagramGenerator; mschaefer@9432: import org.dive4elements.river.exports.LongitudinalSectionGenerator; mschaefer@9444: import org.dive4elements.river.model.BedHeightValueType; mschaefer@9432: import org.dive4elements.river.themes.ThemeDocument; mschaefer@9432: mschaefer@9432: /** mschaefer@9432: * Processor to generate the facets and data series of a bundu bezugswst depth longitudinal section mschaefer@9432: * mschaefer@9432: * @author Matthias Schäfer mschaefer@9432: * mschaefer@9432: */ mschaefer@9432: public final class BezugswstHeightProcessor extends AbstractProcessor { mschaefer@9432: mschaefer@9432: private static final String FACET_CHANNELMIN = "bundu_facet_channelmin"; mschaefer@9432: mschaefer@9432: private static final String FACET_CHANNELMIN_DESCRIPTION = "bundu_facet_channelmin.description"; mschaefer@9432: mschaefer@9432: private static final String FACET_BEDHEIGHT = "bundu_facet_bedheight"; mschaefer@9432: mschaefer@9432: private static final String FACET_BEDHEIGHT_DESCRIPTION = "bundu_facet_bedheight.description"; mschaefer@9432: mschaefer@9444: public static final String FACET_FIELD_BEDHEIGHT_PREFIX = "bundu_facet_bedheight_"; mschaefer@9444: mschaefer@9444: private static final String FACET_FIELD_BEDHEIGHT_FORMAT = FACET_FIELD_BEDHEIGHT_PREFIX + "%02d"; mschaefer@9444: mschaefer@9444: private static final String FACET_FIELD_BEDHEIGHT_DESCRIPTION = "bundu_facet_field_bedheight.description"; mschaefer@9444: mschaefer@9432: private static final String AXIS_LABEL = LongitudinalSectionGenerator.I18N_YAXIS_LABEL; mschaefer@9432: mschaefer@9432: private static final Set HANDLED_FACET_TYPES = new HashSet<>(); mschaefer@9432: mschaefer@9432: static { mschaefer@9432: HANDLED_FACET_TYPES.add(FACET_CHANNELMIN); mschaefer@9432: HANDLED_FACET_TYPES.add(FACET_BEDHEIGHT); mschaefer@9444: for (int i = BedHeightValueType.FIELD_FIRST_INDEX; i <= BedHeightValueType.FIELD_LAST_INDEX; i++) mschaefer@9444: HANDLED_FACET_TYPES.add(String.format(FACET_FIELD_BEDHEIGHT_FORMAT, i)); mschaefer@9432: } mschaefer@9432: mschaefer@9432: public BezugswstHeightProcessor() { mschaefer@9432: super(AXIS_LABEL, HANDLED_FACET_TYPES); mschaefer@9432: } mschaefer@9432: gernotbelger@9583: public static Facet createChannelminFacet(final CallContext context, final String hash, final String id, final int facetIndex, final int resultIndex) { mschaefer@9432: mschaefer@9432: final String description = Resources.getMsg(context.getMeta(), FACET_CHANNELMIN_DESCRIPTION, FACET_CHANNELMIN_DESCRIPTION); mschaefer@9432: return new BezugswstResultFacet(facetIndex, resultIndex, FACET_CHANNELMIN, description, AXIS_LABEL, id, hash); mschaefer@9432: } mschaefer@9432: gernotbelger@9583: public static Facet createBedheightFacet(final CallContext context, final String hash, final String id, final int facetIndex, final int resultIndex, gernotbelger@9583: final String seriesName) { mschaefer@9432: mschaefer@9432: final String description = Resources.getMsg(context.getMeta(), FACET_BEDHEIGHT_DESCRIPTION, FACET_BEDHEIGHT_DESCRIPTION, seriesName); mschaefer@9432: return new BezugswstResultFacet(facetIndex, resultIndex, FACET_BEDHEIGHT, description, AXIS_LABEL, id, hash); mschaefer@9432: } mschaefer@9432: gernotbelger@9583: public static Facet createFieldBedheightFacet(final CallContext context, final String hash, final String id, final int facetIndex, final int resultIndex, gernotbelger@9583: final int fieldIndex) { gernotbelger@9583: final String leftRightAppendixKey = BedHeightValueType.field(fieldIndex).getLeftRightStringAppendix(); gernotbelger@9583: final String leftRightAppendix = Resources.getMsg(context.getMeta(), leftRightAppendixKey, leftRightAppendixKey); gernotbelger@9583: final String description = Resources.getMsg(context.getMeta(), FACET_FIELD_BEDHEIGHT_DESCRIPTION, FACET_FIELD_BEDHEIGHT_DESCRIPTION, fieldIndex, gernotbelger@9583: leftRightAppendix); mschaefer@9444: mschaefer@9444: final String facetName = String.format(FACET_FIELD_BEDHEIGHT_FORMAT, fieldIndex); mschaefer@9444: return new BezugswstResultFacet(facetIndex, resultIndex, facetName, description, AXIS_LABEL, id, hash); mschaefer@9444: } mschaefer@9444: mschaefer@9432: @Override mschaefer@9432: protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { mschaefer@9432: mschaefer@9444: if (bundle.getFacetName().startsWith(FACET_FIELD_BEDHEIGHT_PREFIX)) { mschaefer@9444: final int fieldIndex = Integer.parseInt(bundle.getFacetName().substring(FACET_FIELD_BEDHEIGHT_PREFIX.length())); mschaefer@9444: return generateFieldHeightSeries(generator, bundle, theme, visible, fieldIndex); mschaefer@9444: } mschaefer@9444: mschaefer@9444: return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), null); mschaefer@9432: } mschaefer@9432: mschaefer@9432: protected AbstractResultType doGetType(final String facetName) { mschaefer@9432: mschaefer@9432: if (FACET_CHANNELMIN.contentEquals(facetName)) mschaefer@9432: return BunduResultType.channelLowerEdge; mschaefer@9432: if (FACET_BEDHEIGHT.contentEquals(facetName)) mschaefer@9535: return BunduResultType.heightMeanBed; mschaefer@9432: mschaefer@9432: final String error = String.format("Unknown facet name: %s", facetName); mschaefer@9432: throw new UnsupportedOperationException(error); mschaefer@9432: } mschaefer@9444: mschaefer@9444: private final String generateFieldHeightSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, mschaefer@9444: final boolean visible, final int fieldIndex) { mschaefer@9444: mschaefer@9444: final BezugswstMainCalculationResult data = (BezugswstMainCalculationResult) getResult(generator, bundle); mschaefer@9444: final double[][] points = data.getFieldValuePoints(fieldIndex, BunduResultType.bedHeightFields); mschaefer@9444: mschaefer@9444: return buildSeriesForPoints(points, generator, bundle, theme, visible, null); mschaefer@9444: } mschaefer@9432: }