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; ingo@464: import de.intevation.artifactdatabase.XMLUtils; ingo@464: import de.intevation.artifacts.ArtifactNamespaceContext; 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.InputValidator; tim@335: tim@335: /** tim@335: * @author Tim Englich ingo@456: * @author Ingo Weinzierl 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 inputValueNames = null; tim@335: tim@335: private Map inputValues = null; tim@335: tim@335: private State parent = null; tim@335: tim@335: protected Map 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 getRequiredInputValues() { tim@335: return this.inputValues.values(); tim@335: } tim@335: ingo@470: ingo@470: public void reset(String uuid) { ingo@470: ingo@470: // clear input values of the current state ingo@470: Iterator iter = inputValueNames.iterator(); ingo@470: while (iter.hasNext()) { ingo@470: String name = (String) iter.next(); ingo@470: inputValues.remove(name); ingo@470: } ingo@470: ingo@470: // remove data of last state from cache ingo@470: List describeData = getDescibeData(uuid); ingo@470: if (describeData != null && describeData.size() != 0) { ingo@470: describeData.remove(describeData.size()-1); ingo@470: } ingo@470: } ingo@470: 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(inputValuesNodes tim@335: .getLength()); tim@335: this.inputValueNames = new ArrayList(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, String uuid) tim@335: throws StateException { tim@335: log.debug("StateBase.putInputData"); tim@335: if (inputData != null) { tim@335: Iterator 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( 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, String inputName){ tim@335: Iterator 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 values = (Collection) o; tim@335: tim@335: String value = inputData.getValue(); tim@335: String[] selectedValues = value.split(","); tim@335: Set selectedItems = new HashSet( 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 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 descibeData = this.getDescibeData(uuid); tim@335: if (descibeData != null) { tim@335: Iterator 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: * @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 = 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 list = new ArrayList(); tim@335: Iterator 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, String uuid) { tim@335: log.debug("StateBase.purifyResult"); ingo@470: List describeData = this.getDescibeData(uuid); tim@335: if (describeData == null) { tim@335: describeData = new ArrayList(); tim@335: } tim@335: NamedCollection 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 extractKVP(Collection result, tim@335: String keyid, tim@335: String valueid) { tim@335: Iterator rit = result.iterator(); tim@335: int dataSize = (this.dataNoSelect ? result.size()+1 : result.size()); tim@335: tim@335: NamedCollection keyValueDescibeData = new NamedArrayList( 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@461: // TODO: FIXME: We have to do that because the arcsde does not support a distinct Query on Layers. 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"); ingo@470: ingo@470: List descibeData = this.getDescibeData(uuid); tim@335: if (descibeData != null) { tim@335: Iterator it = descibeData.iterator(); ingo@464: ingo@464: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator( ingo@464: document, ingo@464: ArtifactNamespaceContext.NAMESPACE_URI, ingo@464: ArtifactNamespaceContext.NAMESPACE_PREFIX ingo@464: ); ingo@464: Node staticNode = creator.create("static"); ingo@464: Node dynamic = creator.create("dynamic"); ingo@464: tim@335: rootNode.appendChild(staticNode); tim@335: rootNode.appendChild(dynamic); ingo@464: ingo@464: XMLUtils.ElementCreator xCreator = new XMLUtils.ElementCreator( ingo@464: document, ingo@464: XMLUtils.XFORM_URL, ingo@464: XMLUtils.XFORM_PREFIX ingo@464: ); ingo@464: tim@335: while (it.hasNext()) { tim@335: Object o = it.next(); ingo@456: if ((!it.hasNext() && dataName != null)) { ingo@464: appendToDynamicNode( ingo@464: xCreator, document, dynamic, callMeta, o); ingo@456: } ingo@456: else { ingo@464: appendToStaticNode( ingo@464: xCreator, document, staticNode, callMeta, o); ingo@456: } ingo@456: } ingo@456: } ingo@456: } tim@335: tim@335: ingo@456: protected void appendToStaticNode( ingo@464: XMLUtils.ElementCreator creator, ingo@464: Document document, ingo@464: Node staticNode, ingo@464: CallMeta callMeta, ingo@464: Object o ingo@456: ) { ingo@456: if (o instanceof Collection) { ingo@456: String name = null; ingo@456: boolean multiselect = false; ingo@456: if (o instanceof NamedCollection) { ingo@456: NamedCollection nc = ((NamedCollection) o); ingo@456: name = nc.getName(); ingo@456: multiselect = nc.isMultiSelect(); ingo@456: } else { ingo@456: Object[] names = this.inputValueNames.toArray(); ingo@456: name = names[names.length - 1].toString(); ingo@456: } tim@335: ingo@464: Element selectNode = creator.create(multiselect?"select":"select1"); ingo@464: creator.addAttr(selectNode, "ref", name); tim@335: ingo@464: Element lableNode = creator.create("label"); ingo@456: lableNode.setTextContent(RessourceFactory.getInstance() ingo@456: .getRessource(callMeta.getLanguages(), name, name)); ingo@464: Element choiceNode = creator.create("choices"); tim@335: ingo@456: Collection values = (Collection) o; ingo@456: Iterator resultIt = values.iterator(); ingo@456: while (resultIt.hasNext()) { ingo@456: KeyValueDescibeData result = resultIt.next(); tim@335: ingo@456: if (result.isSelected()) { ingo@464: Element itemNode = creator.create("item"); ingo@456: ingo@464: creator.addAttr(itemNode, "selected", "true"); ingo@456: ingo@464: Element choiceLableNode = creator.create("label"); ingo@456: choiceLableNode.setTextContent(result.getValue()); ingo@456: itemNode.appendChild(choiceLableNode); ingo@456: ingo@464: Element choiceValueNode = creator.create("value"); ingo@464: choiceValueNode.setTextContent("" + result.getKey()); ingo@464: itemNode.appendChild(choiceValueNode); ingo@456: choiceNode.appendChild(itemNode); ingo@456: } ingo@456: } ingo@456: selectNode.appendChild(lableNode); ingo@456: selectNode.appendChild(choiceNode); ingo@456: ingo@456: staticNode.appendChild(selectNode); ingo@456: } ingo@456: else if (o instanceof MinMaxDescribeData) { ingo@456: appendMinMaxDescribeData( ingo@464: creator, ingo@456: document, ingo@456: staticNode, ingo@456: callMeta, ingo@456: o); ingo@456: } ingo@456: else if (o instanceof SingleValueDescribeData) { ingo@456: appendSingleValueDescribeData( ingo@464: creator, ingo@456: document, ingo@456: staticNode, ingo@456: callMeta, ingo@456: o); ingo@456: } ingo@456: } ingo@456: ingo@456: ingo@456: protected void appendToDynamicNode( ingo@464: XMLUtils.ElementCreator creator, ingo@464: Document document, ingo@464: Node dynamicNode, ingo@464: CallMeta callMeta, ingo@464: Object o ingo@456: ) { ingo@456: if (o instanceof Collection) { ingo@456: String name = null; ingo@456: boolean multiselect = false; ingo@456: if (o instanceof NamedCollection) { ingo@456: NamedCollection nc = ((NamedCollection) o); ingo@456: name = nc.getName(); ingo@456: multiselect = nc.isMultiSelect(); ingo@456: } else { ingo@456: Object[] names = this.inputValueNames.toArray(); ingo@456: name = names[names.length - 1].toString(); ingo@464: } ingo@456: ingo@464: Element selectNode = creator.create(multiselect?"select":"select1"); ingo@464: creator.addAttr(selectNode, "ref", name); ingo@456: ingo@464: Element lableNode = creator.create("label"); ingo@456: lableNode.setTextContent(RessourceFactory.getInstance() ingo@456: .getRessource(callMeta.getLanguages(), name, name)); ingo@464: Element choiceNode = creator.create("choices"); ingo@456: ingo@456: Collection values = (Collection) o; ingo@456: Iterator resultIt = values.iterator(); ingo@456: while (resultIt.hasNext()) { ingo@456: KeyValueDescibeData result = resultIt.next(); ingo@464: Element itemNode = creator.create("item"); ingo@456: ingo@456: if (result.isSelected()) { ingo@456: itemNode.setAttribute("selected", "true"); tim@335: } tim@335: ingo@464: Element choiceLableNode = creator.create("label"); ingo@456: choiceLableNode.setTextContent(result.getValue()); ingo@456: itemNode.appendChild(choiceLableNode); ingo@456: ingo@464: Element choicValueNode = creator.create("value"); ingo@456: choicValueNode.setTextContent("" + result.getKey()); ingo@456: itemNode.appendChild(choicValueNode); ingo@456: choiceNode.appendChild(itemNode); tim@335: } ingo@456: selectNode.appendChild(lableNode); ingo@456: selectNode.appendChild(choiceNode); ingo@456: ingo@456: dynamicNode.appendChild(selectNode); tim@335: } ingo@456: else if (o instanceof MinMaxDescribeData) { ingo@456: appendMinMaxDescribeData( ingo@464: creator, ingo@456: document, ingo@456: dynamicNode, ingo@456: callMeta, ingo@456: o); ingo@456: } ingo@456: else if (o instanceof SingleValueDescribeData) { ingo@456: appendSingleValueDescribeData( ingo@464: creator, ingo@456: document, ingo@456: dynamicNode, ingo@456: callMeta, ingo@456: o); ingo@456: } ingo@456: } ingo@456: ingo@456: ingo@456: protected void appendMinMaxDescribeData( ingo@464: XMLUtils.ElementCreator creator, ingo@464: Document document, ingo@464: Node node, ingo@464: CallMeta callMeta, ingo@464: Object o ingo@456: ) { ingo@456: MinMaxDescribeData minMaxDescibeData = (MinMaxDescribeData) o; ingo@456: Object min = minMaxDescibeData.getMinValue(); ingo@456: Object max = minMaxDescibeData.getMaxValue(); ingo@456: if (min instanceof GregorianCalendar) { ingo@456: Date d = ((GregorianCalendar) min).getTime(); ingo@456: min = DateUtils.getPatternedDateAmer(d); ingo@456: } ingo@456: ingo@456: if (max instanceof GregorianCalendar) { ingo@456: Date d = ((GregorianCalendar) max).getTime(); ingo@456: max = DateUtils.getPatternedDateAmer(d); ingo@456: } ingo@456: ingo@464: Element groupNode = creator.create("group"); ingo@464: creator.addAttr(groupNode, "ref", minMaxDescibeData.getName()); ingo@464: Element groupNodeLableNode = creator.create("label"); ingo@456: groupNodeLableNode.setTextContent(RessourceFactory ingo@456: .getInstance().getRessource( ingo@456: callMeta.getLanguages(), ingo@456: minMaxDescibeData.getName(), ingo@456: minMaxDescibeData.getName())); ingo@456: groupNode.appendChild(groupNodeLableNode); ingo@456: ingo@464: Element inputMinNode = creator.create("input"); ingo@464: creator.addAttr(inputMinNode, "ref", MINVALUEFIELDNAME); ingo@464: Element inputMinLableNode = creator.create("label"); ingo@456: inputMinLableNode.setTextContent(RessourceFactory ingo@456: .getInstance().getRessource( ingo@456: callMeta.getLanguages(), MINVALUEFIELDNAME, ingo@456: MINVALUEFIELDNAME)); ingo@456: inputMinNode.appendChild(inputMinLableNode); ingo@456: ingo@464: Element inputMinValueNode = creator.create("value"); ingo@456: inputMinValueNode.setTextContent(min.toString()); ingo@456: inputMinNode.appendChild(inputMinValueNode); ingo@456: ingo@464: Element inputMaxNode = creator.create("input"); ingo@464: creator.addAttr(inputMaxNode, "ref", MAXVALUEFIELDNAME); ingo@464: Element inputMaxLableNode = creator.create("label"); ingo@456: inputMaxLableNode.setTextContent(RessourceFactory ingo@456: .getInstance().getRessource( ingo@456: callMeta.getLanguages(), MAXVALUEFIELDNAME, ingo@456: MAXVALUEFIELDNAME)); ingo@456: inputMaxNode.appendChild(inputMaxLableNode); ingo@456: ingo@464: Element inputMaxValueNode = creator.create("value"); ingo@456: inputMaxValueNode.setTextContent(max.toString()); ingo@456: inputMaxNode.appendChild(inputMaxValueNode); ingo@456: ingo@456: groupNode.appendChild(inputMinNode); ingo@456: groupNode.appendChild(inputMaxNode); ingo@456: ingo@456: node.appendChild(groupNode); ingo@456: } ingo@456: ingo@456: ingo@456: ingo@456: protected void appendSingleValueDescribeData( ingo@464: XMLUtils.ElementCreator creator, ingo@464: Document document, ingo@464: Node node, ingo@464: CallMeta callMeta, ingo@464: Object o ingo@456: ) { ingo@456: SingleValueDescribeData svdb = (SingleValueDescribeData) o; ingo@456: ingo@464: Element groupNode = creator.create("group"); ingo@464: creator.addAttr(groupNode, "ref", svdb.getName()); ingo@464: ingo@464: Element groupNodeLableNode = creator.create("label"); ingo@456: groupNodeLableNode.setTextContent(RessourceFactory ingo@456: .getInstance().getRessource( ingo@456: callMeta.getLanguages(), ingo@456: svdb.getName(), ingo@456: svdb.getName())); ingo@456: groupNode.appendChild(groupNodeLableNode); ingo@456: ingo@464: Element inputNode = creator.create("input"); ingo@464: creator.addAttr(inputNode, "ref", svdb.getName()); ingo@456: ingo@464: Element inputLableNode = creator.create("label"); ingo@456: inputLableNode.setTextContent(""); ingo@456: inputNode.appendChild(inputLableNode); ingo@456: ingo@464: Element inputValueNode = creator.create("value"); ingo@456: inputValueNode.setTextContent(svdb.getValue()); ingo@456: inputNode.appendChild(inputValueNode); ingo@456: ingo@456: groupNode.appendChild(inputNode); ingo@456: ingo@456: node.appendChild(groupNode); tim@335: } tim@335: tim@335: /** tim@335: * @see de.intevation.gnv.state.State#getDescibeData() tim@335: */ ingo@470: protected List 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) { ingo@470: return (List) (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: */ ingo@470: protected void setDescibeData(String uuid, List 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 getInputData() throws StateException { tim@335: return this.inputData != null ? this.inputData.values() : null; tim@335: } tim@335: } ingo@464: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: