ingo@1115: /* ingo@1115: * Copyright (c) 2010 by Intevation GmbH ingo@1115: * ingo@1115: * This program is free software under the LGPL (>=v2.1) ingo@1115: * Read the file LGPL.txt coming with the software for details ingo@1115: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1115: */ ingo@1115: 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@800: import au.com.bytecode.opencsv.CSVWriter; tim@800: import de.intevation.gnv.geobackend.base.Result; tim@800: import de.intevation.gnv.state.describedata.KeyValueDescibeData; tim@800: import de.intevation.gnv.state.exception.StateException; tim@800: 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@835: tim@812: /** tim@812: * The TimeStime which should be integrated in the Export to mark a tim@812: * TimeSeries. tim@812: */ tim@812: private String startTime = 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. sascha@835: * @param startTime The TimeStamp which should ne integrated in the export sascha@835: * to mark a TimeSeries. If it should not be a TimeSeries this Value must tim@812: * be null. tim@765: */ tim@812: public ODVExport(DataCollector collector, Collection parameters, String startTime) { tim@765: super(collector); tim@765: this.parameters = parameters; tim@812: this.startTime = startTime; tim@765: } tim@765: ingo@815: tim@765: @Override ingo@1058: protected void writeData( ingo@1058: Profile profile, Collection result, CSVWriter writer ingo@1058: )throws StateException ingo@1058: { tim@765: Iterator it = result.iterator(); ingo@1058: log.debug("Put " + result.size() + " elements into odv export."); 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: } sascha@835: tim@812: if (this.startTime != null){ tim@812: headerList.add("time_ISO8601"); tim@812: } tim@765: ArrayList paramids = new ArrayList(); sascha@778: ingo@1058: Map> aggregatedRows = ingo@1058: new HashMap>(); sascha@778: tim@765: while (it.hasNext()) { tim@765: Result res = it.next(); tim@765: tim@800: String[] value = collector.getData(res); tim@800: StringArrayKey key = new StringArrayKey(value); tim@765: String parameterValue = res.getString("DATAVALUE"); tim@765: String parameterID = res.getString("PARAMETER"); sascha@778: ingo@1058: if (!paramids.contains(parameterID)){ tim@765: paramids.add(parameterID); ingo@1058: headerList.add(findParamTitle(parameters, parameterID)); tim@765: headerList.add("QF"); tim@765: } sascha@778: tim@765: Map aggregatedRow = aggregatedRows.get(key); tim@765: if (aggregatedRow!= null){ tim@765: aggregatedRow.put(parameterID, parameterValue); ingo@1058: } ingo@1058: 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@800: Iterator rows = aggregatedRows.keySet().iterator(); tim@765: while (rows.hasNext()){ tim@800: StringArrayKey row = rows.next(); tim@765: Map params = aggregatedRows.get(row); tim@765: ArrayList rowList = new ArrayList(); tim@800: String[] rowArray = row.getValue(); tim@800: for (int i= 0; i < rowArray.length; i++){ tim@800: rowList.add(rowArray[i]); tim@765: } tim@812: if (this.startTime != null){ tim@816: String measurementtime = rowList.get(3).replace(' ','T'); tim@816: rowList.set(3, this.startTime.replace('.','-')); tim@816: rowList.add(measurementtime+":00.0"); tim@812: } 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@800: writer.writeNext(rowList.toArray(rowArray)); 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 :