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: ingo@230: package de.intevation.gnv.exports; ingo@230: 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.exception.StateException; sascha@779: tim@765: import java.io.IOException; tim@765: import java.io.OutputStream; tim@765: import java.io.OutputStreamWriter; tim@765: import java.io.UnsupportedEncodingException; sascha@779: tim@765: import java.util.Collection; tim@765: import java.util.Iterator; tim@765: ingo@230: import org.apache.log4j.Logger; ingo@230: ingo@230: /** ingo@771: * This class is the default implementation of {@link Export}. ingo@771: * ingo@771: * @author Sascha L. Teichmann ingo@771: * @author Ingo Weinzierl ingo@230: */ ingo@230: public class DefaultExport ingo@230: implements Export ingo@230: { ingo@771: /** ingo@771: * Logger used for logging via log4j. ingo@771: */ ingo@230: private static Logger log = Logger.getLogger(DefaultExport.class); ingo@230: ingo@771: /** ingo@771: * DataCollector used to extract data from Result objects. ingo@771: */ tim@765: protected Export.DataCollector collector; ingo@233: ingo@771: /** ingo@771: * Constructor ingo@771: * ingo@771: * @param collector See {@link #collector} ingo@771: */ ingo@233: public DefaultExport(Export.DataCollector collector) { ingo@233: this.collector = collector; ingo@233: } ingo@233: ingo@771: /** ingo@771: * This method writes data stored in result into a CSV document ingo@771: * using writer. ingo@771: * ingo@815: * @param profile Profile used to specify the format and columns. ingo@771: * @param result Collection storing the required data. ingo@771: * @param writer CSVWriter to write the csv document. ingo@771: * ingo@771: * @throws StateException ingo@771: */ ingo@230: protected void writeData( sascha@778: Profile profile, ingo@230: Collection result, ingo@230: CSVWriter writer ingo@233: ) tim@335: throws StateException { ingo@230: log.debug("create content for export."); ingo@230: Iterator it = result.iterator(); ingo@230: ingo@239: String[] header = profile.getHeader(); ingo@239: if (header != null) ingo@239: writer.writeNext(header); ingo@239: ingo@230: while (it.hasNext()) { ingo@230: Result res = it.next(); ingo@230: ingo@233: writer.writeNext(collector.getData(res)); ingo@230: } ingo@230: } ingo@230: ingo@771: /** ingo@771: * This method takes a data Collection and writes it to ingo@771: * outputStream using the the format specified by ingo@771: * profile. ingo@771: * ingo@771: * @param profile used to specify the format and columns. ingo@771: * @param outputStream OutputStream which is used for writing the export ingo@771: * document to. ingo@771: * @param result Collection storing the data. ingo@771: * ingo@771: * @throws IOException if writing to OutputStream failed. ingo@771: * @throws UnsupportedEncodingException if the encoding was not accepted. ingo@771: * @throws StateException if result is null. ingo@771: */ ingo@230: public void create( ingo@230: Profile profile, sascha@778: OutputStream outputStream, ingo@230: Collection result ingo@230: ) ingo@230: throws ingo@230: IOException, ingo@230: UnsupportedEncodingException, sascha@778: StateException ingo@230: { ingo@230: if (result == null) { ingo@230: String msg = "No data given for generation of " + ingo@230: profile.getType() + " file."; ingo@230: log.error(msg); tim@335: throw new StateException(msg); ingo@230: } ingo@230: ingo@230: CSVWriter writer = new CSVWriter( ingo@230: new OutputStreamWriter( ingo@230: outputStream, sascha@778: profile.getEncoding()), ingo@230: profile.getSeparator(), ingo@230: profile.getQuoteCharacter(), sascha@778: profile.getEscapeCharacter()); ingo@230: ingo@230: writeData(profile, result, writer); ingo@230: ingo@230: writer.close(); ingo@230: } ingo@230: } ingo@771: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :