ingo@1040: package de.intevation.gnv.utils;
ingo@1040:
ingo@1040: import de.intevation.gnv.geobackend.base.DefaultResult;
ingo@1040: import de.intevation.gnv.geobackend.base.DefaultResultDescriptor;
ingo@1040: import de.intevation.gnv.geobackend.base.Result;
ingo@1040: import de.intevation.gnv.geobackend.base.ResultDescriptor;
ingo@1040:
ingo@1040: import java.util.ArrayList;
ingo@1040: import java.util.Collection;
ingo@1040: import java.util.HashMap;
ingo@1040: import java.util.Iterator;
ingo@1040: import java.util.List;
ingo@1040: import java.util.Map;
ingo@1040:
ingo@1040: import org.apache.log4j.Logger;
ingo@1040:
ingo@1040: /**
ingo@1040: * @author Ingo Weinzierl
ingo@1040: */
ingo@1040: public final class VectorDataProcessor {
ingo@1040:
ingo@1040: private static Logger logger = Logger.getLogger(VectorDataProcessor.class);
ingo@1040:
ingo@1040: public static final String[] COLUMNS = {
ingo@1040: "YORDINATE", "XORDINATE", "GROUP1", "GROUP2", "GROUP3", "GAPID", "SERIES"
ingo@1040: };
ingo@1040:
ingo@1040: public static Collection process(Collection input) {
ingo@1040: logger.info("Process vector data (" + input.size() + " items)");
ingo@1040:
ingo@1040: ResultDescriptor outDescriptor = initResultDescriptor();
ingo@1040: ResultDescriptor inDescriptor = null;
ingo@1040: int[] inIndices = null;
ingo@1040: int columns = -1;
ingo@1040:
ingo@1040: Map series = new HashMap();
ingo@1040:
ingo@1040: // for each result of the incoming result
ingo@1040: for (Result result: input) {
ingo@1040: if (inDescriptor == null || inIndices == null) {
ingo@1040: inDescriptor = result.getResultDescriptor();
ingo@1040: inIndices = inDescriptor.getColumnIndices(COLUMNS);
ingo@1040: columns = inDescriptor.getColumnCount();
ingo@1040: }
ingo@1040:
ingo@1040: // for each column of the incoming result object
ingo@1040: for (int i = 0; i < columns; i++) {
ingo@1040: String name = inDescriptor.getColumnName(i);
ingo@1040:
ingo@1040: if (!StringUtils.contains(COLUMNS, name)) {
ingo@1040: List list = (List) series.get(name);
ingo@1040: if (list == null)
ingo@1040: list = new ArrayList();
ingo@1040:
ingo@1040: Result out = new DefaultResult(outDescriptor);
ingo@1040: Object value = result.getObject(i);
ingo@1040:
ingo@1040: // skipp results that have no data value
ingo@1040: if (value == null)
ingo@1040: continue;
ingo@1040:
ingo@1040: out.addColumnValue(0, value);
ingo@1040:
ingo@1040: // add meta data to result object
ingo@1040: // TODO: Maybe we could do this one single time, because the
ingo@1040: // TODO: meta data will not change
ingo@1040: for (int j = 1; j < inIndices.length -1; j++) {
ingo@1040: out.addColumnValue(j, result.getObject(inIndices[j]));
ingo@1040: }
ingo@1040:
ingo@1040: // add the name of the component to distinguish between
ingo@1040: // different series later in the chart creation
ingo@1040: out.addColumnValue(inIndices.length-1, name);
ingo@1040:
ingo@1040: list.add(out);
ingo@1040: series.put(name, list);
ingo@1040: }
ingo@1040: }
ingo@1040: }
ingo@1040:
ingo@1040: // finally, we put all lists together
ingo@1040: Iterator iter = series.values().iterator();
ingo@1040: List output = new ArrayList();
ingo@1040: while (iter.hasNext()) {
ingo@1040: output.addAll((Collection)iter.next());
ingo@1040: }
ingo@1040:
ingo@1040: logger.info("Data processing created " + output.size() + " elements.");
ingo@1040: return output;
ingo@1040: }
ingo@1040:
ingo@1040:
ingo@1040: public static ResultDescriptor initResultDescriptor() {
ingo@1040: logger.debug("Init ResultDescriptor for outgoing results.");
ingo@1040:
ingo@1040: ResultDescriptor desc = new DefaultResultDescriptor();
ingo@1040:
ingo@1040: for (String name: COLUMNS) {
ingo@1040: desc.addColumn(name, "java.lang.String");
ingo@1040: }
ingo@1040:
ingo@1040: logger.debug("Outgoing ResultDescriptor has " + desc.getColumnCount() +
ingo@1040: " columns");
ingo@1040: return desc;
ingo@1040: }
ingo@1040: }
ingo@1040: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :