tim@765: package de.intevation.gnv.exports;
tim@765:
sascha@779: import au.com.bytecode.opencsv.CSVWriter;
sascha@779:
sascha@779: import de.intevation.gnv.geobackend.base.Result;
sascha@779:
sascha@779: import de.intevation.gnv.state.describedata.KeyValueDescibeData;
sascha@779:
sascha@779: import de.intevation.gnv.state.exception.StateException;
sascha@779:
tim@765: import java.util.ArrayList;
tim@765: import java.util.Collection;
tim@765: import java.util.HashMap;
tim@765: import java.util.Iterator;
tim@765: import java.util.Map;
tim@765:
tim@765: import org.apache.log4j.Logger;
tim@765:
tim@765: /**
ingo@771: * This class is used to create a specific export document which is similar to
ingo@771: * an CSV document.
tim@765: *
ingo@771: * @author Tim Englich
tim@765: */
tim@765: public class ODVExport extends DefaultExport {
tim@765:
ingo@771: /**
ingo@771: * Logger used for logging via log4j.
ingo@771: */
tim@765: private static Logger log = Logger.getLogger(ODVExport.class);
sascha@778:
ingo@771: /**
ingo@771: * Collection of parameters.
ingo@771: */
tim@765: private Collection parameters = null;
sascha@778:
tim@765: /**
tim@765: * Constructor
ingo@794: * @param collector DataCollector used to extract the required data.
ingo@794: * @param parameters A collection of parameters to be displayed in the
ingo@794: * export.
tim@765: */
tim@765: public ODVExport(DataCollector collector, Collection parameters) {
tim@765: super(collector);
tim@765: this.parameters = parameters;
tim@765: }
tim@765:
ingo@771: /**
ingo@771: * @see de.intevation.gnv.exports.Export#writeData(Profile, Collection,
ingo@771: * CSVWriter)
ingo@771: */
tim@765: @Override
tim@765: protected void writeData(Profile profile, Collection result,
tim@765: CSVWriter writer) throws StateException {
tim@765: Iterator it = result.iterator();
tim@765:
tim@765: String[] header = profile.getHeader();
tim@765: ArrayList headerList = new ArrayList();
tim@765: for (int i= 0; i < header.length; i++){
tim@765: headerList.add(header[i]);
tim@765: }
tim@765: ArrayList paramids = new ArrayList();
sascha@778:
tim@765: Map> aggregatedRows = new HashMap>();
sascha@778:
tim@765: String currentParameterID = "N/N";
sascha@778:
tim@765: while (it.hasNext()) {
tim@765: Result res = it.next();
tim@765:
tim@765: String[] key = collector.getData(res);
tim@765: String parameterValue = res.getString("DATAVALUE");
tim@765: String parameterID = res.getString("PARAMETER");
sascha@778:
tim@765: if (!currentParameterID.equals(parameterID)){
tim@765: paramids.add(parameterID);
tim@765: headerList.add(this.findParamTitle(parameters, parameterID));
tim@765: headerList.add("QF");
tim@765: currentParameterID = parameterID;
tim@765: }
sascha@778:
tim@765: Map aggregatedRow = aggregatedRows.get(key);
tim@765: if (aggregatedRow!= null){
tim@765: aggregatedRow.put(parameterID, parameterValue);
tim@765: }else{
tim@765: Map params = new HashMap();
tim@765: params.put(parameterID, parameterValue);
tim@765: aggregatedRows.put(key, params);
tim@765: }
tim@765: }
sascha@778:
tim@765: if (header != null){
tim@765: writer.writeNext(headerList.toArray(header));
tim@765: }
tim@765:
tim@765: Iterator rows = aggregatedRows.keySet().iterator();
tim@765: while (rows.hasNext()){
tim@765: String[] row = rows.next();
tim@765: Map params = aggregatedRows.get(row);
tim@765: ArrayList rowList = new ArrayList();
tim@765: for (int i= 0; i < row.length; i++){
tim@765: rowList.add(row[i]);
tim@765: }
tim@765: for (int i = 0; i < paramids.size();i++){
tim@765: String key = paramids.get(i);
tim@765: String value = params.get(key);
tim@765: if (value == null){
tim@765: value = "";
tim@765: }
tim@765: rowList.add(value);
tim@765: rowList.add("1");
tim@765: }
tim@765: writer.writeNext(rowList.toArray(row));
tim@765: }
tim@765: }
sascha@778:
ingo@771: /**
ingo@771: * This method is used to search specific value coresponding to its key
ingo@771: * id
and return its description.
ingo@771: *
ingo@771: * @param values Collection of parameters.
ingo@771: * @param id Key used to find the value.
ingo@771: *
ingo@771: * @return Description of searched value.
ingo@771: */
tim@765: protected String findParamTitle(Collection values, String id) {
tim@765: log.debug("find description of dataset");
tim@765:
tim@765: if (values != null){
tim@765: Iterator it = values.iterator();
tim@765: while (it.hasNext()) {
tim@765: KeyValueDescibeData data = (KeyValueDescibeData) it.next();
tim@765:
tim@765: if (id.equals(data.getKey()))
tim@765: return data.getValue();
tim@765: }
tim@765: }
tim@765: return "";
tim@765: }
sascha@778:
tim@765:
tim@765: }
ingo@771: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :