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.artifacts.states; ingo@127: ingo@127: import org.apache.log4j.Logger; d@9638: import org.dive4elements.artifactdatabase.data.StateData; teichmann@5831: import org.dive4elements.artifacts.Artifact; teichmann@5831: import org.dive4elements.artifacts.CallContext; teichmann@5831: import org.dive4elements.artifacts.CallMeta; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils; teichmann@5867: import org.dive4elements.river.artifacts.D4EArtifact; teichmann@5831: import org.dive4elements.river.artifacts.resources.Resources; d@9638: import org.w3c.dom.Element; ingo@141: ingo@127: /** ingo@127: * @author Ingo Weinzierl ingo@127: */ ingo@127: public class CalculationSelect extends DefaultState { ingo@127: teichmann@8202: /** The log that is used in this class. */ teichmann@8202: private static Logger log = Logger.getLogger(CalculationSelect.class); ingo@127: felix@4043: /** Name of data item. */ ingo@624: public static final String FIELD_MODE = "calculation_mode"; ingo@624: felix@1148: /** Constant value for the reference line calculation. */ d@9638: public static final String CALCULATION_SURFACE_CURVE = "calc.surface.curve"; ingo@141: felix@1148: /** Constant value for the differences calculation. */ d@9638: public static final String CALCULATION_DURATION_CURVE = "calc.duration.curve"; ingo@141: felix@1148: /** Constant value for the flood map calculation. */ d@9638: public static final String CALCULATION_FLOOD_MAP = "calc.flood.map"; ingo@141: felix@1148: /** Constant value for the profile calculation. */ d@9638: public static final String CALCULATION_DISCHARGE_LONGITUDINAL_CURVE = "calc.discharge.longitudinal.section"; ingo@141: felix@1148: /** Constant value for the state discharge curve calculation. */ d@9638: public static final String CALCULATION_DISCHARGE_CURVE = "calc.discharge.curve"; ingo@141: felix@1152: /** Constant value for the state w differences calculation. */ d@9638: public static final String CALCULATION_W_DIFFERENCES = "calc.w.differences"; felix@1152: sascha@1960: /** Constant value for the state reference curve calculation. */ d@9638: public static final String CALCULATION_REFERENCE_CURVE = "calc.reference.curve"; sascha@1960: ingo@2118: /** Constant value for the historical discharge curve calculation. */ d@9638: public static final String CALCULATION_HISTORICAL_DISCHARGE_CURVE = "calc.historical.discharge.curve"; felix@4041: felix@1152: /** An array that holds all available calculation modes. */ d@9638: public static final String[] CALCULATIONS = { CALCULATION_SURFACE_CURVE, CALCULATION_FLOOD_MAP, CALCULATION_DISCHARGE_CURVE, d@9638: CALCULATION_HISTORICAL_DISCHARGE_CURVE, CALCULATION_DURATION_CURVE, CALCULATION_DISCHARGE_LONGITUDINAL_CURVE, CALCULATION_W_DIFFERENCES, d@9638: CALCULATION_REFERENCE_CURVE }; ingo@141: felix@1148: /** Error message that is thrown if no mode has been chosen. */ d@9638: public static final String ERROR_NO_CALCULATION_MODE = "error_feed_no_calculation_mode"; ingo@323: d@9638: /** d@9638: * Error message that is thrown if an invalid calculation mode has been d@9638: * chosen. d@9638: */ d@9638: public static final String ERROR_INVALID_CALCULATION_MODE = "error_feed_invalid_calculation_mode"; sascha@742: sascha@660: public CalculationSelect() { sascha@660: } ingo@323: felix@4041: /** Create choices (i18ned). */ sascha@660: @Override d@9638: protected Element[] createItems(final XMLUtils.ElementCreator cr, final Artifact artifact, final String name, final CallContext context) { d@9638: final CallMeta meta = context.getMeta(); d@9638: final Element[] calcs = new Element[CALCULATIONS.length]; ingo@127: sascha@2164: for (int i = 0; i < CALCULATIONS.length; ++i) { d@9638: final String calc = CALCULATIONS[i]; d@9638: calcs[i] = createItem(cr, new String[] { Resources.getMsg(meta, calc, calc), calc }); ingo@141: } ingo@141: ingo@141: return calcs; ingo@127: } ingo@127: felix@4041: /** Validate the chosen calculation. */ ingo@323: @Override d@9638: public boolean validate(final Artifact artifact) throws IllegalArgumentException { teichmann@8202: log.debug("CalculationSelect.validate"); d@9638: final D4EArtifact flys = (D4EArtifact) artifact; ingo@323: d@9638: final StateData data = getData(flys, FIELD_MODE); d@9638: String calc = (data != null) ? (String) data.getValue() : null; ingo@323: ingo@323: if (calc == null) { ingo@323: throw new IllegalArgumentException(ERROR_NO_CALCULATION_MODE); ingo@323: } ingo@323: ingo@323: calc = calc.trim().toLowerCase(); ingo@323: d@9638: for (final String mode : CALCULATIONS) { ingo@323: if (mode.equals(calc)) { ingo@323: return true; ingo@323: } ingo@323: } ingo@323: ingo@323: throw new IllegalArgumentException(ERROR_INVALID_CALCULATION_MODE); ingo@323: } ingo@127: } ingo@127: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :