view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/SINFOArtifact.java @ 8980:b194fa64506a

SINFO - show results themes according to spec, either raw data or floating mean values. Some improvements to error handling and handling of empty results.
author gernotbelger
date Thu, 05 Apr 2018 18:30:34 +0200
parents ee5ce13016ed
children 45bbd2c232f8
line wrap: on
line source
/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
 * Software engineering by
 *  Björnsen Beratende Ingenieure GmbH
 *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */
package org.dive4elements.river.artifacts.sinfo;

import org.apache.commons.lang.StringUtils;
import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifactdatabase.state.FacetActivity;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.sinfo.common.D50Processor;
import org.dive4elements.river.artifacts.sinfo.common.FlowDepthDevelopmentPerYearProcessor;
import org.dive4elements.river.artifacts.sinfo.common.FlowDepthDevelopmentProcessor;
import org.dive4elements.river.artifacts.sinfo.common.FlowDepthProcessor;
import org.dive4elements.river.artifacts.sinfo.common.TauProcessor;
import org.dive4elements.river.artifacts.sinfo.common.VelocityProcessor;

/**
 * The default SINFO artifact.
 *
 * @author Gernot Belger
 */
public class SINFOArtifact extends D4EArtifact {

    private static final long serialVersionUID = 1L;

    /** Error message that is thrown if no mode has been chosen. */
    private static final String ERROR_NO_CALCULATION_MODE = "error_feed_no_calculation_mode";

    /**
     * Error message that is thrown if an invalid calculation mode has been
     * chosen.
     */
    private static final String ERROR_INVALID_CALCULATION_MODE = "error_feed_invalid_calculation_mode";

    /** The name of the artifact. */
    private static final String ARTIFACT_NAME = "sinfo";

    private static final String FIELD_RIVER = "river";

    private static final String FIELD_MODE = "calculation_mode";

    static {
        // Active/deactivate facets.
        // BEWARE: we can only define one activity for "sinfo", so we use the artifact as place for this
        FacetActivity.Registry.getInstance().register("sinfo", new FacetActivity() {
            @Override
            public Boolean isInitialActive(final Artifact artifact, final Facet facet, final String output) {

                final String name = facet.getName();

                if ("sinfo_tkk".equals(output)) {
                    if (FlowDepthProcessor.FACET_FLOW_DEPTH_FILTERED.equals(name))
                        return Boolean.FALSE;
                    if (VelocityProcessor.FACET_TKH_VELOCITY_FILTERED.equals(name))
                        return Boolean.FALSE;
                    if (TauProcessor.FACET_TKH_TAU_FILTERED.equals(name))
                        return Boolean.FALSE;
                    if (D50Processor.FACET_TKH_D50_FILTERED.equals(name))
                        return Boolean.FALSE;
                }

                if ("sinfo_flow_depth_development".equals(output)) {
                    if (FlowDepthProcessor.FACET_FLOW_DEPTH_CURRENT_FILTERED.equals(name))
                        return Boolean.FALSE;
                    if (FlowDepthProcessor.FACET_FLOW_DEPTH_HISTORICAL_FILTERED.equals(name))
                        return Boolean.FALSE;
                    if (FlowDepthDevelopmentProcessor.FACET_WATERLEVEL_DIFFERENCE_FILTERED.equals(name))
                        return Boolean.FALSE;
                    if (FlowDepthDevelopmentProcessor.FACET_BEDHEIGHT_DIFFERENCE_FILTERED.equals(name))
                        return Boolean.FALSE;
                }

                if (FlowDepthProcessor.FACET_FLOW_DEPTH_RAW.equals(name))
                    return Boolean.FALSE;
                if (FlowDepthProcessor.FACET_FLOW_DEPTH_TKH_RAW.equals(name))
                    return Boolean.FALSE;
                if (FlowDepthProcessor.FACET_FLOW_DEPTH_CURRENT_RAW.equals(name))
                    return Boolean.FALSE;
                if (FlowDepthProcessor.FACET_FLOW_DEPTH_HISTORICAL_RAW.equals(name))
                    return Boolean.FALSE;
                if (FlowDepthProcessor.FACET_FLOW_DEPTH_MIN_RAW.equals(name))
                    return Boolean.FALSE;
                if (FlowDepthProcessor.FACET_FLOW_DEPTH_MAX_RAW.equals(name))
                    return Boolean.FALSE;

                if (FlowDepthDevelopmentProcessor.FACET_FLOW_DEPTH_DEVELOPMENT_RAW.equals(name))
                    return Boolean.FALSE;
                if (FlowDepthDevelopmentPerYearProcessor.FACET_FLOW_DEPTH_DEVELOPMENT_PER_YEAR_RAW.equals(name))
                    return Boolean.FALSE;

                return null;
            }
        });
    }

    /**
     * Default constructor, because it's serializable.
     */
    public SINFOArtifact() {
    }

    /**
     * Returns the name of the concrete artifact.
     *
     * @return the name of the concrete artifact.
     */
    @Override
    public String getName() {
        return ARTIFACT_NAME;
    }

    public SinfoCalcMode getCalculationMode() {

        final String calc = getDataAsString(FIELD_MODE);
        if (calc == null) {
            throw new IllegalArgumentException(ERROR_NO_CALCULATION_MODE);
        }

        try {
            return SinfoCalcMode.valueOf(StringUtils.trimToEmpty(calc).toLowerCase());
        }
        catch (final Exception e) {
            throw new IllegalArgumentException(ERROR_INVALID_CALCULATION_MODE, e);
        }
    }

    public String getRiver() {
        return getDataAsString(FIELD_RIVER);
    }
}

http://dive4elements.wald.intevation.org