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 :