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@127: import de.intevation.artifactdatabase.ProtocolUtils;
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: 
ingo@127:     /** The logger that is used in this class.*/
ingo@127:     private static Logger logger = Logger.getLogger(CalculationSelect.class);
ingo@127: 
ingo@127: 
ingo@624: 
ingo@624:     public static final String FIELD_MODE = "calculation_mode";
ingo@624: 
ingo@141:     /** Constant value for the reference line calculation.*/
ingo@157:     public static final String CALCULATION_SURFACE_CURVE =
ingo@157:         "calc.surface.curve";
ingo@141: 
ingo@141:     /** Constant value for the differences calculation.*/
ingo@157:     public static final String CALCULATION_DURATION_CURVE =
ingo@157:         "calc.duration.curve";
ingo@141: 
ingo@141:     /** Constant value for the flood map calculation.*/
ingo@141:     public static final String CALCULATION_FLOOD_MAP =
ingo@141:         "calc.flood.map";
ingo@141: 
ingo@141:     /** Constant value for the profile calculation.*/
ingo@157:     public static final String CALCULATION_DISCHARGE_LONGITUDINAL_CURVE =
ingo@157:         "calc.discharge.longitudinal.section";
ingo@141: 
ingo@141:     /** Constant value for the state discharge curve calculation.*/
ingo@157:     public static final String CALCULATION_DISCHARGE_CURVE =
ingo@157:         "calc.discharge.curve";
ingo@141: 
ingo@141:     /** 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@157:         CALCULATION_DURATION_CURVE,
ingo@157:         CALCULATION_DISCHARGE_LONGITUDINAL_CURVE };
ingo@141: 
ingo@141: 
ingo@323:     /** 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
ingo@323:      * 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: 
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: 
ingo@141:         int i = 0;
ingo@141: 
ingo@141:         for (String calc: CALCULATIONS) {
ingo@141:             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: 
ingo@127:     protected Element createItem(XMLUtils.ElementCreator cr, Object obj) {
ingo@127:         Element item  = ProtocolUtils.createArtNode(cr, "item", null, null);
ingo@127:         Element label = ProtocolUtils.createArtNode(cr, "label", null, null);
ingo@127:         Element value = ProtocolUtils.createArtNode(cr, "value", null, null);
ingo@127: 
ingo@127:         String[] arr = (String[]) obj;
ingo@127: 
ingo@127:         label.setTextContent(arr[0]);
ingo@127:         value.setTextContent(arr[1]);
ingo@127: 
ingo@127:         item.appendChild(label);
ingo@127:         item.appendChild(value);
ingo@127: 
ingo@127:         return item;
ingo@127:     }
ingo@323: 
ingo@323: 
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);
ingo@624:         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 :