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 :