ingo@230: package de.intevation.gnv.exports; ingo@230: tim@765: import java.io.IOException; tim@765: import java.io.OutputStream; tim@765: import java.io.OutputStreamWriter; tim@765: import java.io.UnsupportedEncodingException; 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: import au.com.bytecode.opencsv.CSVWriter; ingo@230: import de.intevation.gnv.geobackend.base.Result; tim@335: import de.intevation.gnv.state.exception.StateException; 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@771: * @param profile {@link #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( ingo@230: 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, ingo@230: OutputStream outputStream, ingo@230: Collection result ingo@230: ) ingo@230: throws ingo@230: IOException, ingo@230: UnsupportedEncodingException, tim@335: 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, ingo@230: profile.getEncoding()), ingo@230: profile.getSeparator(), ingo@230: profile.getQuoteCharacter(), ingo@230: 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 :