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 :