tim@335: package de.intevation.gnv.state;
tim@335: 
ingo@860: import de.intevation.artifacts.CallContext;
ingo@860: 
ingo@860: import de.intevation.gnv.artifacts.ressource.RessourceFactory;
sascha@779: import de.intevation.gnv.geobackend.base.Result;
sascha@779: import de.intevation.gnv.state.describedata.DefaultSingleValueDescribeData;
ingo@860: import de.intevation.gnv.state.exception.StateException;
ingo@860: import de.intevation.gnv.utils.InputValidator;
sascha@779: 
tim@335: import java.util.ArrayList;
tim@335: import java.util.Collection;
ingo@860: import java.util.Iterator;
ingo@470: import java.util.List;
ingo@860: import java.util.Locale;
tim@335: 
tim@335: import org.apache.log4j.Logger;
tim@335: 
ingo@860: import org.w3c.dom.Document;
ingo@860: 
tim@335: /**
ingo@796:  * This state handles single user input. The user is allowed to select just one
ingo@796:  * value.
ingo@796:  *
sascha@780:  * @author <a href="mailto:tim.englich@intevation.de">Tim Englich</a>
sascha@778:  *
tim@335:  */
tim@335: public class SingleInputState extends StateBase {
tim@335: 
tim@335:     /**
tim@335:      * the logger, used to log exceptions and additonaly information
tim@335:      */
tim@335:     private static Logger log = Logger.getLogger(SingleInputState.class);
tim@335: 
tim@335:     private static final long serialVersionUID = -6169497306324917318L;
tim@335: 
tim@335:     /**
tim@335:      * Constructor
tim@335:      */
tim@335:     public SingleInputState() {
tim@335:     }
tim@335: 
ingo@815: 
tim@335:     @Override
ingo@607:     protected List<Object> purifyResult(Collection<Result> result, String uuid) {
tim@335:         log.debug("SingleInputState.purifyResult");
ingo@607:         List<Object> describeData = new ArrayList<Object>();
ingo@607: 
tim@335:         String value = null;
tim@335:         if (result != null && result.size() == 1) {
tim@335:             Result tmpItem = result.iterator().next();
tim@335:             value = tmpItem.getObject("MAX").toString();
tim@335:         } else {
tim@335:             value = "";
tim@335:         }
tim@335: 
ingo@473:         describeData.add(new DefaultSingleValueDescribeData(
ingo@473:             this.dataName, value, getID()));
ingo@607: 
ingo@607:         return describeData;
tim@335:     }
ingo@860: 
ingo@860:     /**
ingo@860:      * This feed method needs a collection of two InputData objects. These
ingo@860:      * objects' values need to be a datetime string which is turned into a Date
ingo@860:      * object. Afterwards, the given dates are validated. Min and max date need
ingo@860:      * to be in range of the min and max date retrieved by
ingo@860:      * {@link #getDescibeData(java.lang.String)}.
ingo@860:      */
ingo@860:     @Override
ingo@860:     public Document feed(
ingo@860:         CallContext           context,
ingo@860:         Collection<InputData> inputData,
ingo@860:         String                uuid)
ingo@860:     throws StateException {
ingo@860:         RessourceFactory resFactory = RessourceFactory.getInstance();
ingo@860:         Locale[] serverLocales      = resFactory.getLocales();
ingo@860:         Locale locale               = context.getMeta().getPreferredLocale(
ingo@860:             serverLocales);
ingo@860: 
ingo@860:         if (inputData == null) {
ingo@860:             String msg = "No input data given.";
ingo@860:             log.warn(msg);
ingo@860:             return feedFailure(msg);
ingo@860:         }
ingo@860: 
ingo@860:         Iterator<InputData> it = inputData.iterator();
ingo@860:         InputData tmpItem      = it.next();
ingo@860:         InputValue inputValue  = inputValues.get(tmpItem.getName());
ingo@860: 
ingo@860:         if (inputValue == null) {
ingo@860:             String msg = resFactory.getRessource(
ingo@860:                 locale,
ingo@860:                 EXCEPTION_INVALID_INPUT,
ingo@860:                 EXCEPTION_INVALID_INPUT);
ingo@860:             log.warn(msg);
ingo@860:             return feedFailure(msg);
ingo@860:         }
ingo@860: 
ingo@860:         boolean valid = InputValidator.isInputValid(
ingo@860:             tmpItem.getValue(), inputValue.getType());
ingo@860: 
ingo@860:         if (valid) {
ingo@1038:             String[] desc = getDescriptionForInputData(tmpItem, context, uuid);
ingo@860:             tmpItem.setDescription(desc);
ingo@860: 
ingo@860:             this.inputData.put(tmpItem.getName(), tmpItem);
ingo@860:             return feedSuccess();
ingo@860:         }
ingo@860: 
ingo@860:         else {
ingo@860:             String msg = resFactory.getRessource(
ingo@860:                 locale,
ingo@860:                 EXCEPTION_INVALID_INPUT,
ingo@860:                 EXCEPTION_INVALID_INPUT);
ingo@860:             log.warn(msg);
ingo@860:             return feedFailure(msg);
ingo@860:         }
ingo@860:     }
tim@335: }
sascha@836: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :