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 :