Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/utils/VectorDataProcessor.java @ 1040:70653c29fc1d
Finished vector support for timeseriespoints (Issue27).
gnv-artifacts/trunk@1112 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 19 May 2010 14:05:33 +0000 |
parents | |
children | 9bb1979aabbe |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/utils/VectorDataProcessor.java Wed May 19 14:05:33 2010 +0000 @@ -0,0 +1,107 @@ +package de.intevation.gnv.utils; + +import de.intevation.gnv.geobackend.base.DefaultResult; +import de.intevation.gnv.geobackend.base.DefaultResultDescriptor; +import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.geobackend.base.ResultDescriptor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +/** + * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> + */ +public final class VectorDataProcessor { + + private static Logger logger = Logger.getLogger(VectorDataProcessor.class); + + public static final String[] COLUMNS = { + "YORDINATE", "XORDINATE", "GROUP1", "GROUP2", "GROUP3", "GAPID", "SERIES" + }; + + public static Collection<Result> process(Collection<Result> input) { + logger.info("Process vector data (" + input.size() + " items)"); + + ResultDescriptor outDescriptor = initResultDescriptor(); + ResultDescriptor inDescriptor = null; + int[] inIndices = null; + int columns = -1; + + Map series = new HashMap(); + + // for each result of the incoming result + for (Result result: input) { + if (inDescriptor == null || inIndices == null) { + inDescriptor = result.getResultDescriptor(); + inIndices = inDescriptor.getColumnIndices(COLUMNS); + columns = inDescriptor.getColumnCount(); + } + + // for each column of the incoming result object + for (int i = 0; i < columns; i++) { + String name = inDescriptor.getColumnName(i); + + if (!StringUtils.contains(COLUMNS, name)) { + List list = (List) series.get(name); + if (list == null) + list = new ArrayList(); + + Result out = new DefaultResult(outDescriptor); + Object value = result.getObject(i); + + // skipp results that have no data value + if (value == null) + continue; + + out.addColumnValue(0, value); + + // add meta data to result object + // TODO: Maybe we could do this one single time, because the + // TODO: meta data will not change + for (int j = 1; j < inIndices.length -1; j++) { + out.addColumnValue(j, result.getObject(inIndices[j])); + } + + // add the name of the component to distinguish between + // different series later in the chart creation + out.addColumnValue(inIndices.length-1, name); + + list.add(out); + series.put(name, list); + } + } + } + + // finally, we put all lists together + Iterator iter = series.values().iterator(); + List output = new ArrayList(); + while (iter.hasNext()) { + output.addAll((Collection)iter.next()); + } + + logger.info("Data processing created " + output.size() + " elements."); + return output; + } + + + public static ResultDescriptor initResultDescriptor() { + logger.debug("Init ResultDescriptor for outgoing results."); + + ResultDescriptor desc = new DefaultResultDescriptor(); + + for (String name: COLUMNS) { + desc.addColumn(name, "java.lang.String"); + } + + logger.debug("Outgoing ResultDescriptor has " + desc.getColumnCount() + + " columns"); + return desc; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :