tim@335: /**
tim@335:  *
tim@335:  */
tim@335: package de.intevation.gnv.state;
tim@335: 
tim@335: import java.util.ArrayList;
tim@335: import java.util.Collection;
tim@335: import java.util.Date;
tim@335: import java.util.GregorianCalendar;
tim@335: import java.util.HashMap;
tim@335: import java.util.HashSet;
tim@335: import java.util.Iterator;
tim@335: import java.util.List;
tim@335: import java.util.Map;
tim@335: import java.util.Set;
tim@335: 
tim@335: import org.apache.log4j.Logger;
tim@335: import org.w3c.dom.Document;
tim@335: import org.w3c.dom.Element;
tim@335: import org.w3c.dom.Node;
tim@335: import org.w3c.dom.NodeList;
tim@335: 
tim@335: import de.intevation.artifactdatabase.Config;
tim@335: import de.intevation.artifacts.CallMeta;
tim@335: import de.intevation.gnv.artifacts.GNVArtifactBase;
tim@335: import de.intevation.gnv.artifacts.cache.CacheFactory;
tim@335: import de.intevation.gnv.artifacts.ressource.RessourceFactory;
tim@335: import de.intevation.gnv.geobackend.base.Result;
tim@335: import de.intevation.gnv.geobackend.base.query.QueryExecutor;
tim@335: import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory;
tim@335: import de.intevation.gnv.geobackend.base.query.exception.QueryException;
tim@335: import de.intevation.gnv.geobackend.util.DateUtils;
tim@335: import de.intevation.gnv.state.describedata.DefaultKeyValueDescribeData;
tim@335: import de.intevation.gnv.state.describedata.KeyValueDescibeData;
tim@335: import de.intevation.gnv.state.describedata.MinMaxDescribeData;
tim@335: import de.intevation.gnv.state.describedata.NamedArrayList;
tim@335: import de.intevation.gnv.state.describedata.NamedCollection;
tim@335: import de.intevation.gnv.state.describedata.SingleValueDescribeData;
tim@335: import de.intevation.gnv.state.exception.StateException;
tim@335: import de.intevation.gnv.utils.ArtifactXMLUtilities;
tim@335: import de.intevation.gnv.utils.InputValidator;
tim@335: 
tim@335: /**
tim@335:  * @author Tim Englich <tim.englich@intevation.de>
tim@335:  * 
tim@335:  */
tim@335: public abstract class StateBase implements State {
tim@335: 
tim@335:     /**
tim@335:      * The UID of this Class
tim@335:      */
tim@335:     private static final long serialVersionUID = 2411169179001645426L;
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(GNVArtifactBase.class);
tim@335:     
tim@335:     private final static String MINVALUEFIELDNAME = "minvalue";
tim@335:     private final static String MAXVALUEFIELDNAME = "maxvalue";
tim@335:     
tim@335:     private final static String NODATASELECTIONKEY = "n/n";
tim@335:     
tim@335:     private final static String DESCRIBEDATAKEY = "_DESCRIBEDATA";
tim@335: 
tim@335:     private String id = null;
tim@335: 
tim@335:     private String description = null;
tim@335: 
tim@335:     protected String dataName = null;
tim@335: 
tim@335:     protected boolean dataMultiSelect = false;
tim@335:     
tim@335:     protected boolean dataNoSelect = false;
tim@335: 
tim@335:     protected String queryID = null;
tim@335: 
tim@335:     protected Collection<String> inputValueNames = null;
tim@335: 
tim@335:     private Map<String, InputValue> inputValues = null;
tim@335: 
tim@335:     private State parent = null;
tim@335: 
tim@335:     protected Map<String, InputData> inputData = null;
tim@335:     
tim@335: 
tim@335:     /**
tim@335:      * Constructor
tim@335:      */
tim@335:     public StateBase() {
tim@335:         super();
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#getID()
tim@335:      */
tim@335:     public String getID() {
tim@335:         return this.id;
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#getDescription()
tim@335:      */
tim@335:     public String getDescription() {
tim@335:         return this.description;
tim@335:     }
tim@335: 
tim@335: 
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#getRequiredInputValues()
tim@335:      */
tim@335:     public Collection<InputValue> getRequiredInputValues() {
tim@335:         return this.inputValues.values();
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#setup(org.w3c.dom.Node)
tim@335:      */
tim@335:     public void setup(Node configuration) {
tim@335:         log.debug("StateBase.setup");
tim@335:         this.id = ((Element)configuration).getAttribute("id");
tim@335:         this.description = ((Element)configuration).getAttribute("description");
tim@335: 
tim@335:         log.info("State-ID = " + this.id);
tim@335:         
tim@335:         NodeList inputValuesNodes = Config.getNodeSetXPath(configuration,
tim@335:                 "inputvalues/inputvalue");
tim@335:         this.inputValues = new HashMap<String, InputValue>(inputValuesNodes
tim@335:                 .getLength());
tim@335:         this.inputValueNames = new ArrayList<String>(inputValuesNodes
tim@335:                 .getLength());
tim@335:         for (int i = 0; i < inputValuesNodes.getLength(); i++) {
tim@335:             Element inputValueNode = (Element)inputValuesNodes.item(i);
tim@335:             String usedinQueryValue = inputValueNode.getAttribute("usedinquery");
tim@335:             int usedinQuery = 1;
tim@335:             if (usedinQueryValue != null) {
tim@335:                 try {
tim@335:                     usedinQuery = Integer.parseInt(usedinQueryValue);
tim@335:                 } catch (NumberFormatException e) {
tim@335:                     log
tim@335:                             .warn("Used in Query Value cannot be transformed into a Number");
tim@335:                 }
tim@335:             }
tim@335:             InputValue inputValue = new DefaultInputValue(inputValueNode.getAttribute("name"), 
tim@335:                                                           inputValueNode.getAttribute("type"), 
tim@335:                                                           Boolean.parseBoolean(inputValueNode.
tim@335:                                                           getAttribute("multiselect")), usedinQuery);
tim@335:             log.debug(inputValue.toString());
tim@335:             this.inputValues.put(inputValue.getName(), inputValue);
tim@335:             this.inputValueNames.add(inputValue.getName());
tim@335:         }
tim@335: 
tim@335:         this.queryID = Config.getStringXPath(configuration, "queryID");
tim@335:         log.info("QueryID ==> " + this.queryID);
tim@335: 
tim@335:         this.dataName = Config.getStringXPath(configuration, "dataname");
tim@335: 
tim@335:         String dataMultiSelectValue = Config.getStringXPath(configuration,
tim@335:                                                            "data-multiselect");
tim@335:         if (dataMultiSelectValue != null) {
tim@335:             this.dataMultiSelect = Boolean.parseBoolean(dataMultiSelectValue);
tim@335:         }
tim@335:         
tim@335:         String dataNoSelectValue =Config.getStringXPath(configuration,
tim@335:                                                         "data-noselect");
tim@335:         if (dataNoSelectValue != null) {
tim@335:             this. dataNoSelect = Boolean.parseBoolean(dataNoSelectValue);
tim@335:         }
tim@335:         
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#getParent()
tim@335:      */
tim@335:     public State getParent() {
tim@335:         return this.parent;
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#setParent(de.intevation.gnv.state.State)
tim@335:      */
tim@335:     public void setParent(State state) {
tim@335:         this.parent = state;
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#putInputData(java.util.Collection)
tim@335:      */
tim@335:     public void putInputData(Collection<InputData> inputData, String uuid)
tim@335:                                                                           throws StateException {
tim@335:         log.debug("StateBase.putInputData");
tim@335:         if (inputData != null) {
tim@335:             Iterator<InputData> it = inputData.iterator();
tim@335:             InputValidator iv = new InputValidator();
tim@335:             while (it.hasNext()) {
tim@335:                 InputData tmpItem = it.next();
tim@335:                 InputValue inputValue = this.inputValues.get(tmpItem.getName());
tim@335:                 if (inputValue != null) {
tim@335:                     if (this.inputData == null) {
tim@335:                         this.inputData = new HashMap<String, InputData>(
tim@335:                                 inputData.size());
tim@335:                     }
tim@335:                     
tim@335:                     boolean valid = iv.isInputValid(tmpItem.getValue(),
tim@335:                             inputValue.getType());
tim@335:                     if (valid) {
tim@335:                         if (tmpItem.getName().equals(MINVALUEFIELDNAME)){
tim@335:                             String minValue = tmpItem.getValue();
tim@335:                             String maxValue = this.getInputValue4ID(inputData, MAXVALUEFIELDNAME);
tim@335:                             valid = iv.isInputValid(maxValue,inputValue.getType());
tim@335:                             if (!valid){
tim@335:                                 String errMsg = "Wrong input for " + tmpItem.getValue()
tim@335:                                                 + " is not an " + inputValue.getType()
tim@335:                                                 + " Value.";
tim@335:                                 log.warn(errMsg);
tim@335:                                 throw new StateException(errMsg);
tim@335:                             }
tim@335:                             
tim@335:                             valid = iv.isInputValid(minValue, 
tim@335:                                     maxValue,
tim@335:                                     inputValue.getType());
tim@335:                             if (!valid){
tim@335:                                 String errMsg = "MaxValue-Input is less than MinValue-Input ";
tim@335:                                 log.warn(errMsg);
tim@335:                                 throw new StateException(errMsg);
tim@335:                             }
tim@335:                         }else if (tmpItem.getName().equals(MAXVALUEFIELDNAME)){
tim@335:                             String minValue = this.getInputValue4ID(inputData, MINVALUEFIELDNAME);
tim@335:                             String maxValue = tmpItem.getValue();
tim@335:                             valid = iv.isInputValid(minValue,inputValue.getType());
tim@335:                             if (!valid){
tim@335:                                 String errMsg = "Wrong input for " + tmpItem.getValue()
tim@335:                                                 + " is not an " + inputValue.getType()
tim@335:                                                 + " Value.";
tim@335:                                 log.warn(errMsg);
tim@335:                                 throw new StateException(errMsg);
tim@335:                             }
tim@335:                             
tim@335:                             valid = iv.isInputValid(minValue, 
tim@335:                                                     maxValue,
tim@335:                                                     inputValue.getType());
tim@335:                             if (!valid){
tim@335:                                 String errMsg = "MaxValue-Input is less than MinValue-Input ";
tim@335:                                 log.warn(errMsg);
tim@335:                                 throw new StateException(errMsg);
tim@335:                             }
tim@335:                         }
tim@335:                         this.setSelection(tmpItem, uuid);
tim@335:                         this.inputData.put(tmpItem.getName(), tmpItem);
tim@335:                     } else {
tim@335:                         String errMsg = "Wrong input for " + tmpItem.getValue()
tim@335:                                         + " is not an " + inputValue.getType()
tim@335:                                         + " Value.";
tim@335:                         log.warn(errMsg);
tim@335:                         throw new StateException(errMsg);
tim@335:                     }
tim@335: 
tim@335:                 } else {
tim@335:                     String errMsg = "No Inputvalue given for Inputdata "
tim@335:                                     + tmpItem.getName();
tim@335:                     log.warn(errMsg + "Value will be ignored");
tim@335: 
tim@335:                 }
tim@335:             }
tim@335:         } else {
tim@335:             log.warn("No Inputdata given");
tim@335:         }
tim@335:     }
tim@335:     
tim@335:     private String getInputValue4ID(Collection<InputData> inputData, String inputName){
tim@335:         Iterator<InputData> it = inputData.iterator();
tim@335:         while (it.hasNext()) {
tim@335:             InputData tmpItem = it.next();
tim@335:             if (tmpItem.getName().equals(inputName)){
tim@335:                 return tmpItem.getValue();
tim@335:             }
tim@335:         }
tim@335:         return null;
tim@335:     }
tim@335: 
tim@335:     private void setSelection(InputData inputData, String uuid) {
tim@335:         log.debug("StateBase.setSelection");
tim@335: 
tim@335:         Object o = this.getDescribeData(inputData.getName(),uuid);
tim@335:         if (o != null) {
tim@335:             if (o instanceof Collection<?>) {
tim@335:                 Collection<KeyValueDescibeData> values = (Collection<KeyValueDescibeData>) o;
tim@335: 
tim@335:                 String value = inputData.getValue();
tim@335:                 String[] selectedValues = value.split(",");
tim@335:                 Set<String> selectedItems = new HashSet<String>(
tim@335:                         selectedValues.length);
tim@335:                 for (int i = 0; i < selectedValues.length; i++) {
tim@335:                     selectedItems.add(selectedValues[i].trim());
tim@335:                 }
tim@335:                 // Selektion umsetzen
tim@335:                 Iterator<KeyValueDescibeData> it = values.iterator();
tim@335:                 while (it.hasNext()) {
tim@335:                     KeyValueDescibeData data = it.next();
tim@335:                     String key = "" + data.getKey();
tim@335:                     boolean selected = selectedItems.contains(key);
tim@335:                     data.setSelected(selected);
tim@335:                 }
tim@335:             } else if (o instanceof MinMaxDescribeData) {
tim@335:                 MinMaxDescribeData data = (MinMaxDescribeData) o;
tim@335:                 if (inputData.getName().equals(MINVALUEFIELDNAME)) {
tim@335:                     data.setMinValue(inputData.getValue());
tim@335:                 }
tim@335:                 if (inputData.getName().equals(MAXVALUEFIELDNAME)) {
tim@335:                     data.setMaxValue(inputData.getValue());
tim@335:                 }
tim@335:             } else if (o instanceof SingleValueDescribeData) {
tim@335:                 ((SingleValueDescribeData)o).setValue(inputData.getValue());
tim@335:             }
tim@335:         }
tim@335:     }
tim@335: 
tim@335:     private Object getDescribeData(String name, String uuid) {
tim@335:         log.debug("StateBase.getDescribeData");
tim@335:         Collection<Object> descibeData = this.getDescibeData(uuid);
tim@335:         if (descibeData != null) {
tim@335:             Iterator<Object> it = descibeData.iterator();
tim@335:             while (it.hasNext()) {
tim@335:                 Object o = it.next();
tim@335:                 if (o instanceof NamedCollection<?>) {
tim@335:                     if (name.equals(((NamedCollection<?>) o).getName())) {
tim@335:                         return o;
tim@335:                     }
tim@335:                 } else if (o instanceof MinMaxDescribeData) {
tim@335:                     if (name.equals(((MinMaxDescribeData) o).getMinName())) {
tim@335:                         return o;
tim@335:                     }
tim@335:                     if (name.equals(((MinMaxDescribeData) o).getMaxName())) {
tim@335:                         return o;
tim@335:                     }
tim@335:                 }else if (o instanceof SingleValueDescribeData) {
tim@335:                     if (name.equals(((SingleValueDescribeData)o).getName())){
tim@335:                         return o;
tim@335:                     }
tim@335:                 }
tim@335:             }
tim@335:         }
tim@335:         return null;
tim@335: 
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#advance(java.lang.String,
tim@335:      *      de.intevation.artifacts.CallMeta)
tim@335:      */
tim@335:     public void advance(String uuid, CallMeta callMeta)
tim@335:                                                    throws StateException {
tim@335:     }
tim@335:     
tim@335:     public void initialize(String uuid, CallMeta callMeta)
tim@335:                                                    throws StateException {
tim@335:         log.debug("StateBase.initialize");
tim@335:         try {
tim@335:             String[] filterValues = this
tim@335:                     .generateFilterValuesFromInputData();
tim@335:             Collection<Result> result = null;
tim@335:             try {
tim@335:                 if (this.queryID != null) {
tim@335:                     QueryExecutor queryExecutor = QueryExecutorFactory
tim@335:                             .getInstance().getQueryExecutor();
tim@335:                     result = queryExecutor.executeQuery(this.queryID,
tim@335:                             filterValues);
tim@335:                 }
tim@335:                 this.purifyResult(result, uuid);
tim@335:             } catch (RuntimeException e) {
tim@335:                 log.error(e, e);
tim@335:             }
tim@335:         } catch (QueryException e) {
tim@335:             log.error(e, e);
tim@335:             throw new StateException(e);
tim@335:         }
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @return
tim@335:      */
tim@335:     protected String[] generateFilterValuesFromInputData() {
tim@335:         List<String> list = new ArrayList<String>();
tim@335:         Iterator<String> it = this.inputValueNames.iterator();
tim@335:         while (it.hasNext()) {
tim@335:             String value = it.next();
tim@335:             InputData data = this.inputData.get(value);
tim@335:             if (data != null
tim@335:                 && this.inputValues.containsKey(data.getName())) {
tim@335:                 int size = this.inputValues.get(data.getName())
tim@335:                         .usedInQueries();
tim@335:                 String type = this.inputValues.get(data.getName())
tim@335:                         .getType();
tim@335:                 String requestValue = data.getValue();
tim@335:                 if (type.equalsIgnoreCase("string")) {
tim@335:                     requestValue = this
tim@335:                             .prepareInputData4DBQuery(requestValue);
tim@335:                 } else if (type.equalsIgnoreCase("date")) {
tim@335:                     requestValue = this
tim@335:                             .prepareInputData4DateDBQuery(requestValue);
tim@335:                 } else if (type.equalsIgnoreCase("coordinate")){
tim@335:                     requestValue = this
tim@335:                     .prepareInputData4RegionDBQuery(requestValue);
tim@335:                 }
tim@335:                 for (int j = 0; j < size; j++) {
tim@335:                     list.add(requestValue);
tim@335:                 }
tim@335:             }
tim@335:         }
ingo@428:         String[] filterValues = list.toArray(new String[list.size()]);
tim@335:         return filterValues;
tim@335:     }
tim@335:     
tim@335:     protected String prepareInputData4RegionDBQuery(String value){
tim@335:         return value;
tim@335:     }
tim@335: 
tim@335:     private String prepareInputData4DateDBQuery(String value) {
tim@335:         log.debug("StateBase.prepareInputData4DateDBQuery");
tim@335:         if (value != null) {
tim@335:             String[] values = value.split(",");
tim@335:             String newValue = "";
tim@335:             for (int i = 0; i < values.length; i++) {
tim@335:                 if (newValue.length() > 0) {
tim@335:                     newValue = newValue + " , ";
tim@335:                 }
tim@335:                 // TODO JUST HACK FIND A BETTER RESOLUTION
tim@335:                 newValue = newValue + "to_date('" + values[i].trim()
tim@335:                            + "', 'YYYY.MM.DD HH24:MI:SS')";
tim@335:             }
tim@335:             return newValue;
tim@335:         }
tim@335: 
tim@335:         return value;
tim@335:     }
tim@335: 
tim@335:     private String prepareInputData4DBQuery(String value) {
tim@335:         log.debug("StateBase.prepareInputData4DBQuery");
tim@335:         if (value != null) {
tim@335:             String[] values = value.split(",");
tim@335:             String newValue = "";
tim@335:             for (int i = 0; i < values.length; i++) {
tim@335:                 if (newValue.length() > 0) {
tim@335:                     newValue = newValue + " , ";
tim@335:                 }
tim@335:                 newValue = newValue + "'" + values[i].trim() + "'";
tim@335:             }
tim@335:             return newValue;
tim@335:         }
tim@335: 
tim@335:         return value;
tim@335: 
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @param result
tim@335:      */
tim@335:     protected void purifyResult(Collection<Result> result, String uuid) {
tim@335:         log.debug("StateBase.purifyResult");
tim@335:         Collection<Object> describeData = this.getDescibeData(uuid);
tim@335:         if (describeData == null) {
tim@335:             describeData = new ArrayList<Object>();
tim@335:         }
tim@335:         NamedCollection<KeyValueDescibeData> keyValueDescibeData = extractKVP(result, "KEY", "VALUE");
tim@335:         describeData.add(keyValueDescibeData); 
tim@335:         this.setDescibeData(uuid, describeData);
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @param result
tim@335:      * @return
tim@335:      */
tim@335:     protected NamedCollection<KeyValueDescibeData> extractKVP(Collection<Result> result,
tim@335:                                                               String keyid,
tim@335:                                                               String valueid) {
tim@335:         Iterator<Result> rit = result.iterator();
tim@335:         int dataSize = (this.dataNoSelect ? result.size()+1 : result.size());
tim@335:         
tim@335:         NamedCollection<KeyValueDescibeData> keyValueDescibeData = new NamedArrayList<KeyValueDescibeData>(
tim@335:                 this.dataName, dataSize);
tim@335:         keyValueDescibeData.setMultiSelect(this.dataMultiSelect);
tim@335:         
tim@335:         if (this.dataNoSelect){
tim@335:             keyValueDescibeData.add(new DefaultKeyValueDescribeData(NODATASELECTIONKEY, 
tim@335:                                                                     "No Selection"));
tim@335:         }
tim@335:         boolean initialized = false;
tim@335:         int keyPos= 0;
tim@335:         int valuePos = 1;
tim@335:         String previousKey = null;
tim@335:         while (rit.hasNext()) {
tim@335:             Result resultValue = rit.next();
tim@335:             if (!initialized){
tim@335:                 keyPos = resultValue.getResultDescriptor().getColumnIndex(keyid);
tim@335:                 valuePos = resultValue.getResultDescriptor().getColumnIndex(valueid);
tim@335:                 if (valuePos < 0){
tim@335:                     valuePos = 1;
tim@335:                 }
tim@335:                 initialized = true;
tim@335:             }
tim@335:             String tmpKey = resultValue.getString(keyPos);
tim@335:             // TODO: HACK da die ARCSDE kein DISTINCT auf r�umlichen Anfragen unterst�tzt.
tim@335:             if (previousKey == null || !tmpKey.equals(previousKey)){
tim@335:                 previousKey = tmpKey;
tim@335:                 keyValueDescibeData.add(new DefaultKeyValueDescribeData(tmpKey, resultValue.getString(valuePos)));
tim@335:             }
tim@335:         }
tim@335:         return keyValueDescibeData;
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#describe(org.w3c.dom.Document,
tim@335:      *      org.w3c.dom.Node, de.intevation.artifacts.CallMeta,
tim@335:      *      java.lang.String)
tim@335:      */
tim@335:     public void describe(Document document, Node rootNode, CallMeta callMeta,String uuid) {
tim@335:         log.debug("StateBase.describe");
tim@335:         Collection<Object> descibeData = this.getDescibeData(uuid);
tim@335:         if (descibeData != null) {
tim@335:             ArtifactXMLUtilities xmlutilities = new ArtifactXMLUtilities();
tim@335:             Iterator<Object> it = descibeData.iterator();
tim@335:             Node staticNode = xmlutilities.createArtifactElement(document,
tim@335:                     "static");
tim@335:             Node dynamic = xmlutilities.createArtifactElement(document,
tim@335:                     "dynamic");
tim@335:             rootNode.appendChild(staticNode);
tim@335:             rootNode.appendChild(dynamic);
tim@335:             while (it.hasNext()) {
tim@335: 
tim@335:                 Object o = it.next();
tim@335:                 if (o instanceof Collection<?>) {
tim@335:                     String name = null;
tim@335:                     boolean multiselect = false;
tim@335:                     if (o instanceof NamedCollection<?>) {
tim@335:                         NamedCollection<?> nc = ((NamedCollection<?>) o);
tim@335:                         name = nc.getName();
tim@335:                         multiselect = nc.isMultiSelect();
tim@335:                     } else {
tim@335:                         Object[] names = this.inputValueNames.toArray();
tim@335:                         name = names[names.length - 1].toString();
tim@335:                     }
tim@335: 
tim@335:                     Element selectNode = xmlutilities.createXFormElement(
tim@335:                             document, multiselect ? "select" : "select1");
tim@335:                     selectNode.setAttribute("ref", name);
tim@335: 
tim@335:                     Element lableNode = xmlutilities.createXFormElement(
tim@335:                             document, "label");
tim@335:                     lableNode.setTextContent(RessourceFactory.getInstance()
tim@335:                             .getRessource(callMeta.getLanguages(), name, name));
tim@335:                     Element choiceNode = xmlutilities.createXFormElement(
tim@335:                             document, "choices");
tim@335: 
tim@335:                     Collection<KeyValueDescibeData> values = (Collection<KeyValueDescibeData>) o;
tim@335:                     Iterator<KeyValueDescibeData> resultIt = values.iterator();
tim@335:                     while (resultIt.hasNext()) {
tim@335:                         KeyValueDescibeData result = resultIt.next();
tim@335:                         Element itemNode = xmlutilities.createXFormElement(
tim@335:                                 document, "item");
tim@335: 
tim@335:                         if (result.isSelected()) {
tim@335:                             itemNode.setAttribute("selected", "true");
tim@335:                         }
tim@335: 
tim@335:                         Element choiceLableNode = xmlutilities
tim@335:                                 .createXFormElement(document, "label");
tim@335:                         choiceLableNode.setTextContent(result.getValue());
tim@335:                         itemNode.appendChild(choiceLableNode);
tim@335: 
tim@335:                         Element choicValueNode = xmlutilities
tim@335:                                 .createXFormElement(document, "value");
tim@335:                         choicValueNode.setTextContent("" + result.getKey());
tim@335:                         itemNode.appendChild(choicValueNode);
tim@335:                         choiceNode.appendChild(itemNode);
tim@335:                     }
tim@335:                     selectNode.appendChild(lableNode);
tim@335:                     selectNode.appendChild(choiceNode);
tim@335: 
tim@335:                     if (!it.hasNext() && this.dataName != null) {
tim@335:                         dynamic.appendChild(selectNode);
tim@335:                     } else {
tim@335:                         staticNode.appendChild(selectNode);
tim@335:                     }
tim@335: 
tim@335:                 } else if (o instanceof MinMaxDescribeData) {
tim@335:                     MinMaxDescribeData minMaxDescibeData = (MinMaxDescribeData) o;
tim@335:                     Object min = minMaxDescibeData.getMinValue();
tim@335:                     Object max = minMaxDescibeData.getMaxValue();
tim@335:                     if (min instanceof GregorianCalendar) {
tim@335:                         Date d = ((GregorianCalendar) min).getTime();
tim@335:                         min = DateUtils.getPatternedDateAmer(d);
tim@335:                     }
tim@335: 
tim@335:                     if (max instanceof GregorianCalendar) {
tim@335:                         Date d = ((GregorianCalendar) max).getTime();
tim@335:                         max = DateUtils.getPatternedDateAmer(d);
tim@335:                     }
tim@335:                     
tim@335:                     Element groupNode = xmlutilities.createXFormElement(
tim@335:                             document, "group");
tim@335:                     groupNode.setAttribute("ref", minMaxDescibeData.getName());
tim@335:                     Element groupNodeLableNode = xmlutilities
tim@335:                             .createXFormElement(document, "label");
tim@335:                     groupNodeLableNode.setTextContent(RessourceFactory
tim@335:                             .getInstance().getRessource(
tim@335:                                     callMeta.getLanguages(),
tim@335:                                     minMaxDescibeData.getName(),
tim@335:                                     minMaxDescibeData.getName()));
tim@335:                     groupNode.appendChild(groupNodeLableNode);
tim@335: 
tim@335:                     Element inputMinNode = xmlutilities.createXFormElement(
tim@335:                             document, "input");
tim@335:                     inputMinNode.setAttribute("ref", MINVALUEFIELDNAME);
tim@335:                     Element inputMinLableNode = xmlutilities
tim@335:                             .createXFormElement(document, "label");
tim@335:                     inputMinLableNode.setTextContent(RessourceFactory
tim@335:                             .getInstance().getRessource(
tim@335:                                     callMeta.getLanguages(), MINVALUEFIELDNAME,
tim@335:                                     MINVALUEFIELDNAME));
tim@335:                     inputMinNode.appendChild(inputMinLableNode);
tim@335: 
tim@335:                     Element inputMinValueNode = xmlutilities
tim@335:                             .createXFormElement(document, "value");
tim@335:                     inputMinValueNode.setTextContent(min.toString());
tim@335:                     inputMinNode.appendChild(inputMinValueNode);
tim@335: 
tim@335:                     Element inputMaxNode = xmlutilities.createXFormElement(
tim@335:                             document, "input");
tim@335:                     inputMaxNode.setAttribute("ref", MAXVALUEFIELDNAME);
tim@335:                     Element inputMaxLableNode = xmlutilities
tim@335:                             .createXFormElement(document, "label");
tim@335:                     inputMaxLableNode.setTextContent(RessourceFactory
tim@335:                             .getInstance().getRessource(
tim@335:                                     callMeta.getLanguages(), MAXVALUEFIELDNAME,
tim@335:                                     MAXVALUEFIELDNAME));
tim@335:                     inputMaxNode.appendChild(inputMaxLableNode);
tim@335: 
tim@335:                     Element inputMaxValueNode = xmlutilities
tim@335:                             .createXFormElement(document, "value");
tim@335:                     inputMaxValueNode.setTextContent(max.toString());
tim@335:                     inputMaxNode.appendChild(inputMaxValueNode);
tim@335: 
tim@335:                     groupNode.appendChild(inputMinNode);
tim@335:                     groupNode.appendChild(inputMaxNode);
tim@335:                     
tim@335:                     if (!it.hasNext() && this.dataName != null) {
tim@335:                         dynamic.appendChild(groupNode);
tim@335:                     } else {
tim@335:                         staticNode.appendChild(groupNode);
tim@335:                     }
tim@335:                 } else if (o instanceof SingleValueDescribeData) {
tim@335: 
tim@335:                     SingleValueDescribeData svdb = (SingleValueDescribeData) o;
tim@335:                     
tim@335:                     Element groupNode = xmlutilities.createXFormElement(
tim@335:                             document, "group");
tim@335:                     groupNode.setAttribute("ref",  svdb.getName());
tim@335:                     Element groupNodeLableNode = xmlutilities
tim@335:                             .createXFormElement(document, "label");
tim@335:                     groupNodeLableNode.setTextContent(RessourceFactory
tim@335:                             .getInstance().getRessource(
tim@335:                                     callMeta.getLanguages(),
tim@335:                                     svdb.getName(),
tim@335:                                     svdb.getName()));
tim@335:                     groupNode.appendChild(groupNodeLableNode);
tim@335: 
tim@335:                     Element inputNode = xmlutilities.createXFormElement(
tim@335:                             document, "input");
tim@335:                     inputNode.setAttribute("ref", svdb.getName());
tim@335: 
tim@335:                     Element inputLableNode = xmlutilities.createXFormElement(
tim@335:                             document, "label");
tim@335:                     inputLableNode.setTextContent("");
tim@335:                     inputNode.appendChild(inputLableNode);
tim@335: 
tim@335:                     Element inputValueNode = xmlutilities.createXFormElement(
tim@335:                             document, "value");
tim@335:                     inputValueNode.setTextContent(svdb.getValue());
tim@335:                     inputNode.appendChild(inputValueNode);
tim@335: 
tim@335:                     groupNode.appendChild(inputNode);
tim@335:                     if (!it.hasNext() && this.dataName != null) {
tim@335:                         dynamic.appendChild(groupNode);
tim@335:                     } else {
tim@335:                         staticNode.appendChild(groupNode);
tim@335:                     }
tim@335:                 }
tim@335: 
tim@335:             }
tim@335:         }
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#getDescibeData()
tim@335:      */
tim@335:     protected Collection<Object> getDescibeData(String uuid) {
tim@335:         if (CacheFactory.getInstance().isInitialized()) {
tim@335:             String key = uuid + DESCRIBEDATAKEY;
tim@335:             log.debug("Hash for Queryelements: " + key);
tim@335:             net.sf.ehcache.Element value = CacheFactory.getInstance().getCache().get(key);
tim@335:             if (value != null) {
tim@335:                 return (Collection<Object>) (value.getObjectValue());
tim@335:             }
tim@335:         }
tim@335:         return null;
tim@335:     }
tim@335:     
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#getDescibeData()
tim@335:      */
tim@335:     protected void setDescibeData(String uuid, Collection<Object> describeData) {
tim@335:         
tim@335:         if (CacheFactory.getInstance().isInitialized()) {
tim@335:             String key = uuid + DESCRIBEDATAKEY;
tim@335:             log.debug("Hash for Queryelements: " + key);
tim@335:             CacheFactory.getInstance().getCache().put(new net.sf.ehcache.Element(key, describeData));
tim@335:         }
tim@335:     }
tim@335: 
tim@335:     /**
tim@335:      * @see de.intevation.gnv.state.State#getInputData()
tim@335:      */
tim@335:     public Collection<InputData> getInputData() throws StateException {
tim@335:         return this.inputData != null ? this.inputData.values() : null;
tim@335:     }
tim@335: }