ingo@1040: package de.intevation.gnv.utils;
ingo@1040:
ingo@1081: import de.intevation.artifacts.CallContext;
ingo@1081:
ingo@1081: import de.intevation.gnv.chart.Chart;
ingo@1081: import de.intevation.gnv.chart.ChartLabels;
ingo@1081: import de.intevation.gnv.chart.DefaultHistogram;
ingo@1081:
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@1081: import de.intevation.gnv.histogram.HistogramHelper;
ingo@1081:
ingo@1081: import de.intevation.gnv.state.describedata.KeyValueDescibeData;
ingo@1081:
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@1081: import java.util.Locale;
ingo@1040: import java.util.Map;
ingo@1040:
ingo@1040: import org.apache.log4j.Logger;
ingo@1040:
ingo@1081: import org.jfree.chart.ChartTheme;
ingo@1081:
ingo@1081:
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@1071: public static Collection process(
ingo@1071: Collection input, String[] columnNames)
ingo@1071: {
ingo@1040: logger.info("Process vector data (" + input.size() + " items)");
ingo@1040:
ingo@1071: ResultDescriptor outDescriptor = initResultDescriptor(columnNames);
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@1071: inIndices = inDescriptor.getColumnIndices(columnNames);
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@1071: if (!StringUtils.contains(columnNames, 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@1071: public static ResultDescriptor initResultDescriptor(String[] columnNames) {
ingo@1040: logger.debug("Init ResultDescriptor for outgoing results.");
ingo@1040:
ingo@1040: ResultDescriptor desc = new DefaultResultDescriptor();
ingo@1040:
ingo@1071: for (String name: columnNames) {
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@1081:
ingo@1081:
ingo@1081: public static Chart[] getHistograms(
ingo@1081: String uuid,
ingo@1081: CallContext callContext,
ingo@1081: Collection results,
ingo@1081: ChartTheme theme,
ingo@1081: Map requestParameter
ingo@1081: ) {
ingo@1081: Locale locale = (Locale) requestParameter.get("locale");
ingo@1081:
ingo@1081: Object[][] data = HistogramHelper.prepareVectorialHistogramData(results);
ingo@1081: int size = data.length;
ingo@1081:
ingo@1081: Chart[] histograms = new Chart[size];
ingo@1081:
ingo@1081: for (int i = 0; i < size; i++) {
ingo@1081: ChartLabels labels = HistogramHelper.createHistogramLabels(
ingo@1081: uuid, callContext, locale, data[i]);
ingo@1081:
ingo@1081: histograms[i] = new DefaultHistogram(
ingo@1081: labels, data[i], theme, requestParameter);
ingo@1081: }
ingo@1081:
ingo@1081: return histograms;
ingo@1081: }
ingo@1040: }
ingo@1040: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :