ingo@634: package de.intevation.gnv.state; ingo@634: ingo@634: import de.intevation.artifacts.CallMeta; ingo@634: import de.intevation.artifactdatabase.XMLUtils; ingo@634: ingo@634: import de.intevation.gnv.artifacts.ressource.RessourceFactory; ingo@634: import de.intevation.gnv.geobackend.base.Result; ingo@634: import de.intevation.gnv.geobackend.base.ResultDescriptor; ingo@634: import de.intevation.gnv.state.describedata.ExtendedKeyValueData; ingo@634: import de.intevation.gnv.state.describedata.KeyValueDescibeData; ingo@634: import de.intevation.gnv.state.describedata.NamedArrayList; ingo@634: import de.intevation.gnv.state.describedata.NamedCollection; ingo@634: import de.intevation.gnv.transition.DefaultTransition; ingo@634: ingo@634: import java.util.ArrayList; ingo@634: import java.util.Arrays; ingo@634: import java.util.Collection; ingo@634: import java.util.Iterator; ingo@634: import java.util.List; ingo@634: ingo@634: import org.apache.log4j.Logger; ingo@634: ingo@634: import org.w3c.dom.Document; ingo@634: import org.w3c.dom.Element; ingo@634: import org.w3c.dom.Node; ingo@634: ingo@634: /** ingo@634: * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) ingo@634: */ ingo@634: public class MeasurementState ingo@634: extends DefaultState ingo@634: { ingo@634: private static Logger logger = Logger.getLogger(MeasurementState.class); ingo@634: ingo@634: public static final String SQL_KEY_PARAMETERID = "PARAMETERID"; ingo@634: ingo@634: ingo@634: private class ParameterMatrix { ingo@634: private final Logger logger = ingo@634: Logger.getLogger(ParameterMatrix.class); ingo@634: ingo@634: private List measurements; ingo@634: private List mDescriptions; ingo@634: private List parameters; ingo@634: private boolean[][] values; ingo@634: ingo@634: public ParameterMatrix(Collection data, String[] parameter) { ingo@634: measurements = new ArrayList(data.size()); ingo@634: mDescriptions = new ArrayList(data.size()); ingo@634: parameters = new ArrayList(parameter.length); ingo@634: ingo@634: values = new boolean[data.size()][parameter.length]; ingo@634: for (int i = 0; i < data.size(); i++) { ingo@634: Arrays.fill(values[i], false); ingo@634: } ingo@634: ingo@634: initParameters(parameter); ingo@634: initMeasurements(data); ingo@634: } ingo@634: ingo@634: private void initMeasurements(Collection data) { ingo@634: Iterator iter = data.iterator(); ingo@634: while (iter.hasNext()) { ingo@634: ExtendedKeyValueData value = (ExtendedKeyValueData) iter.next(); ingo@634: String key = value.getKey(); ingo@634: String val = value.getValue(); ingo@634: String parameter = value.getParameter(); ingo@634: ingo@634: int i = measurements.indexOf(key); ingo@634: int j = parameters.indexOf(parameter); ingo@634: int tmp = mDescriptions.indexOf(val); ingo@634: ingo@634: if (i < 0) { ingo@634: measurements.add(key); ingo@634: i = measurements.indexOf(key); ingo@634: } ingo@634: ingo@634: if (j < 0) { ingo@634: logger.warn("Not a valid parameter: " + parameter); ingo@634: } ingo@634: ingo@634: if (tmp < 0) { ingo@634: mDescriptions.add(val); ingo@634: tmp = mDescriptions.indexOf(val); ingo@634: } ingo@634: ingo@634: if (i >= 0 && i < measurements.size() && j >= 0 ingo@634: && j < parameters.size()) ingo@634: { ingo@634: values[i][j] = true; ingo@634: } ingo@634: } ingo@634: } ingo@634: ingo@634: private void initParameters(String[] parameter) { ingo@634: int count = parameter.length; ingo@634: for (int i = 0; i < count; i++) { ingo@634: parameters.add(parameter[i]); ingo@634: } ingo@634: } ingo@634: ingo@634: public int measurementSize() { ingo@634: if (measurements != null) ingo@634: return measurements.size(); ingo@634: ingo@634: return 0; ingo@634: } ingo@634: ingo@634: public int parameterSize() { ingo@634: if (parameters != null) ingo@634: return parameters.size(); ingo@634: ingo@634: return 0; ingo@634: } ingo@634: ingo@634: public String getMeasurement(int idx) { ingo@634: if (idx >= 0 && idx < measurements.size()) ingo@634: return (String) measurements.get(idx); ingo@634: ingo@634: logger.warn("Index is out of bounds: " + idx); ingo@634: return ""; ingo@634: } ingo@634: ingo@634: public String getParameter(int idx) { ingo@634: if (idx >= 0 && idx < parameters.size()) { ingo@634: logger.debug("############### PARAM: " + parameters.get(idx)); ingo@634: return (String) parameters.get(idx); ingo@634: } ingo@634: ingo@634: logger.warn("Index is out of bounds: " + idx); ingo@634: return ""; ingo@634: } ingo@634: ingo@634: public String getMDescription(int idx) { ingo@634: if (mDescriptions != null) { ingo@634: return (String) mDescriptions.get(idx); ingo@634: } ingo@634: ingo@634: return null; ingo@634: } ingo@634: ingo@634: public boolean isValid(int i, int j) { ingo@634: if (i < 0 || i > measurements.size() ingo@634: || j < 0 || j > parameters.size()) ingo@634: { ingo@634: logger.warn("Index out of bounds: " + i + "|" + j); ingo@634: return false; ingo@634: } ingo@634: ingo@634: return values[i][j]; ingo@634: } ingo@634: } // End of ParameterMatrix ingo@634: ingo@634: ingo@634: public MeasurementState() { ingo@634: super(); ingo@634: } ingo@634: ingo@634: @Override ingo@634: protected NamedCollection extractKVP( ingo@634: Collection result, ingo@634: String keyid, ingo@634: String valueid ingo@634: ) { ingo@634: NamedCollection kvdd = ingo@634: new NamedArrayList(dataName, result.size()); ingo@634: ingo@634: kvdd.setMultiSelect(true); ingo@634: ingo@634: int keyPos = -1; ingo@634: int valPos = -1; ingo@634: int parPos = -1; ingo@634: ingo@634: for (Result res: result) { ingo@634: if (keyPos < 0 || valPos < 0 || parPos < 0) { ingo@634: ResultDescriptor rd = res.getResultDescriptor(); ingo@634: ingo@634: keyPos = rd.getColumnIndex(keyid); ingo@634: valPos = rd.getColumnIndex(valueid); ingo@634: parPos = rd.getColumnIndex(SQL_KEY_PARAMETERID); ingo@634: } ingo@634: ingo@634: kvdd.add(new ExtendedKeyValueData( ingo@634: res.getString(keyPos), ingo@634: res.getString(valPos), ingo@634: getID(), ingo@634: res.getString(parPos))); ingo@634: } ingo@634: ingo@634: return kvdd; ingo@634: } ingo@634: ingo@634: ingo@634: @Override ingo@634: protected void appendToDynamicNode( ingo@634: XMLUtils.ElementCreator artCreator, ingo@634: XMLUtils.ElementCreator creator, ingo@634: Document document, ingo@634: Node dynamicNode, ingo@634: CallMeta callMeta, ingo@634: Object o ingo@634: ) { ingo@634: NamedArrayList all = (NamedArrayList) o; ingo@634: String name = all.getName(); ingo@634: RessourceFactory factory = RessourceFactory.getInstance(); ingo@634: ingo@634: Element matrixNode = creator.create("group"); ingo@634: Element matrixLabel = creator.create("label"); ingo@634: matrixLabel.setTextContent(factory.getRessource( ingo@634: callMeta.getLanguages(), all.getName(), all.getName())); ingo@634: creator.addAttr(matrixNode, "mode", "matrix"); ingo@634: matrixNode.appendChild(matrixLabel); ingo@634: ingo@634: InputData inputParam = inputData.get("parameterid"); ingo@634: ParameterMatrix matrix = new ParameterMatrix(all, inputParam.splitValue()); ingo@634: ingo@634: int measurements = matrix.measurementSize(); ingo@634: int parameters = matrix.parameterSize(); ingo@634: ingo@634: for (int i = 0; i < measurements; i++) { ingo@634: Element select = creator.create("select"); ingo@634: creator.addAttr(select, "label", matrix.getMDescription(i)); ingo@634: ingo@634: for (int j = 0; j < parameters; j++) { ingo@634: Element item = creator.create("item"); ingo@634: Element label = creator.create("label"); ingo@634: Element value = creator.create("value"); ingo@634: ingo@634: creator.addAttr(item, "ref", name); ingo@634: creator.addAttr( ingo@634: item, ingo@634: "parameter", ingo@634: inputParam.getDescription(matrix.getParameter(j))); ingo@634: ingo@634: if (!matrix.isValid(i, j)) { ingo@634: creator.addAttr(item, "disabled", "true"); ingo@634: } ingo@634: else { ingo@634: creator.addAttr(item, "disabled", "false"); ingo@634: } ingo@634: ingo@634: label.setTextContent(matrix.getMDescription(i)); ingo@634: value.setTextContent(matrix.getMeasurement(i)); ingo@634: ingo@634: item.appendChild(label); ingo@634: item.appendChild(value); ingo@634: select.appendChild(item); ingo@634: } ingo@634: ingo@634: matrixNode.appendChild(select); ingo@634: } ingo@634: ingo@634: dynamicNode.appendChild(matrixNode); ingo@634: } ingo@634: } ingo@634: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: