ingo@634: package de.intevation.gnv.state;
ingo@634:
sascha@652: import de.intevation.artifactdatabase.XMLUtils;
sascha@652:
ingo@634: import de.intevation.artifacts.CallMeta;
ingo@634:
ingo@634: import de.intevation.gnv.artifacts.ressource.RessourceFactory;
sascha@652:
ingo@634: import de.intevation.gnv.geobackend.base.Result;
ingo@634: import de.intevation.gnv.geobackend.base.ResultDescriptor;
sascha@652:
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:
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: /**
sascha@780: * @author Ingo Weinzierl
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: 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@744: for (int i = 0; i < parameters; i++) {
ingo@634: Element select = creator.create("select");
ingo@744: creator.addAttr(select, "label", inputParam.getDescription(matrix.getParameter(i)));
ingo@650: creator.addAttr(select, "ref", name);
ingo@634:
ingo@744: for (int j = 0; j < measurements; 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@744: matrix.getMDescription(j));
ingo@634:
ingo@744: if (!matrix.isValid(j, i)) {
ingo@634: creator.addAttr(item, "disabled", "true");
ingo@634: }
ingo@634: else {
ingo@634: creator.addAttr(item, "disabled", "false");
ingo@634: }
ingo@634:
ingo@744: label.setTextContent(matrix.getMDescription(j));
ingo@744: value.setTextContent(matrix.getMeasurement(j));
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: