tim@765: package de.intevation.gnv.exports; tim@765: 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: import au.com.bytecode.opencsv.CSVWriter; tim@765: import de.intevation.gnv.geobackend.base.Result; tim@765: import de.intevation.gnv.state.describedata.KeyValueDescibeData; tim@765: import de.intevation.gnv.state.exception.StateException; tim@765: 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 tim@765: * @param collector 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 :