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 :