ingo@127: package de.intevation.flys.artifacts.states;
ingo@127: 
ingo@127: import org.apache.log4j.Logger;
ingo@127: 
ingo@127: import org.w3c.dom.Element;
ingo@127: 
ingo@313: import de.intevation.artifacts.Artifact;
ingo@127: import de.intevation.artifacts.CallContext;
ingo@141: import de.intevation.artifacts.CallMeta;
ingo@127: 
ingo@127: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@127: 
ingo@323: import de.intevation.artifactdatabase.data.StateData;
ingo@127: 
ingo@624: import de.intevation.flys.artifacts.FLYSArtifact;
ingo@141: import de.intevation.flys.artifacts.resources.Resources;
ingo@141: 
ingo@127: /**
ingo@127:  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
ingo@127:  */
ingo@127: public class CalculationSelect extends DefaultState {
ingo@127: 
felix@1148:     /** The logger that is used in this class. */
ingo@127:     private static Logger logger = 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. */
ingo@157:     public static final String CALCULATION_SURFACE_CURVE =
ingo@157:         "calc.surface.curve";
ingo@141: 
felix@1148:     /** Constant value for the differences calculation. */
ingo@157:     public static final String CALCULATION_DURATION_CURVE =
ingo@157:         "calc.duration.curve";
ingo@141: 
felix@1148:     /** Constant value for the flood map calculation. */
ingo@141:     public static final String CALCULATION_FLOOD_MAP =
ingo@141:         "calc.flood.map";
ingo@141: 
felix@1148:     /** Constant value for the profile calculation. */
ingo@157:     public static final String CALCULATION_DISCHARGE_LONGITUDINAL_CURVE =
ingo@157:         "calc.discharge.longitudinal.section";
ingo@141: 
felix@1148:     /** Constant value for the state discharge curve calculation. */
ingo@157:     public static final String CALCULATION_DISCHARGE_CURVE =
ingo@157:         "calc.discharge.curve";
ingo@141: 
felix@1152:     /** Constant value for the state w differences calculation. */
felix@1152:     public static final String CALCULATION_W_DIFFERENCES =
felix@1152:         "calc.w.differences";
felix@1152: 
sascha@1960:     /** Constant value for the state reference curve calculation. */
sascha@1960:     public static final String CALCULATION_REFERENCE_CURVE =
sascha@1960:         "calc.reference.curve";
sascha@1960: 
ingo@2118:     /** Constant value for the historical discharge curve calculation. */
ingo@2118:     public static final String CALCULATION_HISTORICAL_DISCHARGE_CURVE =
ingo@2118:         "calc.historical.discharge.curve";
ingo@2118: 
felix@4041:     /** Constant value for the extreme W curve calculation. */
felix@4041:     public static final String CALCULATION_EXTREME =
felix@4041:         "calc.extreme.curve";
felix@4041: 
felix@1152:     /** An array that holds all available calculation modes. */
ingo@141:     public static final String[] CALCULATIONS = {
ingo@157:         CALCULATION_SURFACE_CURVE,
ingo@141:         CALCULATION_FLOOD_MAP,
ingo@157:         CALCULATION_DISCHARGE_CURVE,
ingo@2118:         CALCULATION_HISTORICAL_DISCHARGE_CURVE,
ingo@157:         CALCULATION_DURATION_CURVE,
felix@1152:         CALCULATION_DISCHARGE_LONGITUDINAL_CURVE,
sascha@1960:         CALCULATION_W_DIFFERENCES,
felix@4041:         CALCULATION_REFERENCE_CURVE,
felix@4041:         CALCULATION_EXTREME};
ingo@141: 
ingo@141: 
felix@1148:     /** Error message that is thrown if no mode has been chosen. */
ingo@323:     public static final String ERROR_NO_CALCULATION_MODE =
ingo@323:         "error_feed_no_calculation_mode";
ingo@323: 
ingo@323:     /** Error message that is thrown if an invalid calculation mode has been
felix@1148:      * chosen. */
ingo@323:     public static  final String ERROR_INVALID_CALCULATION_MODE =
ingo@323:         "error_feed_invalid_calculation_mode";
ingo@323: 
sascha@742: 
sascha@660:     public CalculationSelect() {
sascha@660:     }
ingo@323: 
sascha@660: 
felix@4041:     /** Create choices (i18ned). */
sascha@660:     @Override
ingo@127:     protected Element[] createItems(
ingo@127:         XMLUtils.ElementCreator cr,
ingo@313:         Artifact    artifact,
ingo@127:         String      name,
ingo@127:         CallContext context)
ingo@127:     {
ingo@141:         CallMeta meta   = context.getMeta();
ingo@141:         Element[] calcs = new Element[CALCULATIONS.length];
ingo@127: 
sascha@2164:         for (int i = 0; i < CALCULATIONS.length; ++i) {
sascha@2164:             String calc = CALCULATIONS[i];
sascha@2164:             calcs[i] = createItem(
ingo@141:                 cr, new String[] {
ingo@141:                     Resources.getMsg(meta, calc, calc),
ingo@141:                     calc
ingo@141:                 });
ingo@141:         }
ingo@141: 
ingo@141:         return calcs;
ingo@127:     }
ingo@127: 
ingo@127: 
felix@4041:     /** Validate the chosen calculation. */
ingo@323:     @Override
sascha@1050:     public boolean validate(Artifact artifact)
ingo@323:     throws IllegalArgumentException
ingo@323:     {
ingo@323:         logger.debug("CalculationSelect.validate");
ingo@624:         FLYSArtifact flys = (FLYSArtifact) artifact;
ingo@323: 
ingo@624:         StateData data = getData(flys, FIELD_MODE);
felix@1148:         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: 
ingo@323:         for (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 :