view gnv-artifacts/src/main/java/de/intevation/gnv/utils/VectorDataProcessor.java @ 1115:f953c9a559d8

Added license file and license headers. gnv-artifacts/trunk@1260 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Tue, 02 Nov 2010 17:46:55 +0000
parents 846b2b70b2e0
children
line wrap: on
line source
/*
 * Copyright (c) 2010 by Intevation GmbH
 *
 * This program is free software under the LGPL (>=v2.1)
 * Read the file LGPL.txt coming with the software for details
 * or visit http://www.gnu.org/licenses/ if it does not exist.
 */

package de.intevation.gnv.utils;

import de.intevation.artifacts.CallContext;

import de.intevation.gnv.chart.Chart;
import de.intevation.gnv.chart.ChartLabels;
import de.intevation.gnv.chart.DefaultHistogram;

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 de.intevation.gnv.histogram.HistogramHelper;

import de.intevation.gnv.state.describedata.KeyValueDescibeData;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.log4j.Logger;

import org.jfree.chart.ChartTheme;


/**
 * @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 Collection<Result> process(
        Collection<Result> input, String[] columnNames)
    {
        logger.info("Process vector data (" + input.size() + " items)");

        ResultDescriptor outDescriptor = initResultDescriptor(columnNames);
        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(columnNames);
                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(columnNames, 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(String[] columnNames) {
        logger.debug("Init ResultDescriptor for outgoing results.");

        ResultDescriptor desc = new DefaultResultDescriptor();

        for (String name: columnNames) {
            desc.addColumn(name, "java.lang.String");
        }

        logger.debug("Outgoing ResultDescriptor has " + desc.getColumnCount() +
                     " columns");
        return desc;
    }


    public static Chart[] getHistograms(
        String                          uuid,
        CallContext                     callContext,
        Collection<KeyValueDescibeData> results,
        ChartTheme                      theme,
        Map                             requestParameter
    ) {
        Locale locale = (Locale) requestParameter.get("locale");

        Object[][] data = HistogramHelper.prepareVectorialHistogramData(results);
        int        size = data.length;

        Chart[]    histograms = new Chart[size];

        for (int i = 0; i < size; i++) {
            ChartLabels labels = HistogramHelper.createHistogramLabels(
                uuid, callContext, locale, data[i]);

            histograms[i] = new DefaultHistogram(
                labels, data[i], theme, requestParameter);
        }

        return histograms;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org