CsvDataSetWriter.java

  1. /*
  2.  *
  3.  * The DbUnit Database Testing Framework
  4.  * Copyright (C)2002-2004, DbUnit.org
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * This library is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with this library; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  *
  20.  */
  21. package org.dbunit.dataset.csv;

  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;

  24. import java.io.File;
  25. import java.io.FileWriter;
  26. import java.io.IOException;
  27. import java.io.PrintWriter;
  28. import java.io.Writer;
  29. import java.util.Iterator;
  30. import java.util.LinkedList;
  31. import java.util.List;

  32. import org.dbunit.dataset.Column;
  33. import org.dbunit.dataset.DataSetException;
  34. import org.dbunit.dataset.IDataSet;
  35. import org.dbunit.dataset.ITable;
  36. import org.dbunit.dataset.ITableMetaData;
  37. import org.dbunit.dataset.datatype.DataType;
  38. import org.dbunit.dataset.datatype.TypeCastException;
  39. import org.dbunit.dataset.stream.DataSetProducerAdapter;
  40. import org.dbunit.dataset.stream.IDataSetConsumer;

  41. /**
  42.  * @author fede
  43.  * @since 24-set-2003 15.27.05
  44.  * @version $Revision$
  45.  */
  46. public class CsvDataSetWriter implements IDataSetConsumer {

  47.     /**
  48.      * Logger for this class
  49.      */
  50.     private static final Logger logger = LoggerFactory.getLogger(CsvDataSetWriter.class);

  51.     /**
  52.      * todo: customizable separators (field, lines), manage the writers opened for each table
  53.      */

  54.     public static final String NULL = "null";
  55.     private static final String NONE = "none";
  56.     private static final String FIELD_SEPARATOR = ", ";
  57.     private static final String QUOTE = "\"";
  58.     private static final String ESCAPE = "\\";

  59.     private Writer writer;
  60.     private ITableMetaData _activeMetaData;
  61.     private String theDirectory;
  62.     private static char testExport;
  63.     /** list of tables */
  64.     private List tableList;

  65.     public CsvDataSetWriter(String theDirectory) {
  66.         setTheDirectory(theDirectory);
  67.     }

  68.     public CsvDataSetWriter(File theDirectory) {
  69.         setTheDirectory(theDirectory.getAbsolutePath());
  70.     }

  71.     public void write(IDataSet dataSet) throws DataSetException {
  72.         logger.debug("write(dataSet={}) - start", dataSet);

  73.         DataSetProducerAdapter provider = new DataSetProducerAdapter(dataSet);
  74.         provider.setConsumer(this);
  75.         provider.produce();
  76.     }

  77.     public void startDataSet() throws DataSetException {
  78.         logger.debug("startDataSet() - start");

  79.         try {
  80.             tableList = new LinkedList();
  81.             new File(getTheDirectory()).mkdirs();
  82.         } catch (Exception e) {
  83.             throw new DataSetException("Error while creating the destination directory '" + getTheDirectory() + "'", e);
  84.         }
  85.     }

  86.     public void endDataSet() throws DataSetException {
  87.         logger.debug("endDataSet() - start");

  88.         // write out table ordering file
  89.         File orderingFile = new File(getTheDirectory(), CsvDataSet.TABLE_ORDERING_FILE);
  90.        
  91.         PrintWriter pw = null;
  92.         try {
  93.             pw = new PrintWriter(new FileWriter(orderingFile));
  94.             for (Iterator fileNames = tableList.iterator(); fileNames.hasNext();) {
  95.                 String file = (String) fileNames.next();
  96.                 pw.println(file);
  97.             }
  98.         }
  99.         catch (IOException e) {
  100.             throw new DataSetException("problems writing the table ordering file", e);
  101.         }
  102.         finally {
  103.             if(pw != null){
  104.                 pw.close();
  105.             }
  106.         }
  107.     }

  108.     public void startTable(ITableMetaData metaData) throws DataSetException {
  109.         logger.debug("startTable(metaData={}) - start", metaData);

  110.         try {
  111.             _activeMetaData = metaData;
  112.             String tableName = _activeMetaData.getTableName();
  113.             setWriter(new FileWriter(getTheDirectory() + File.separator + tableName + ".csv"));
  114.             writeColumnNames();
  115.             getWriter().write(System.getProperty("line.separator"));
  116.         } catch (IOException e) {
  117.             throw new DataSetException(e);
  118.         }

  119.     }

  120.     private void writeColumnNames() throws DataSetException, IOException {
  121.         logger.debug("writeColumnNames() - start");

  122.         Column[] columns = _activeMetaData.getColumns();
  123.         for (int i = 0; i < columns.length; i++) {
  124.             String columnName = columns[i].getColumnName();
  125.             getWriter().write(columnName);
  126.             if (i < columns.length - 1) getWriter().write(FIELD_SEPARATOR);
  127.         }
  128.     }

  129.     public void endTable() throws DataSetException {
  130.         logger.debug("endTable() - start");

  131.         try {
  132.             getWriter().close();
  133.             tableList.add(_activeMetaData.getTableName());
  134.             _activeMetaData = null;
  135.         } catch (IOException e) {
  136.             throw new DataSetException(e);
  137.         }
  138.     }

  139.     public void row(Object[] values) throws DataSetException {
  140.         logger.debug("row(values={}) - start", values);

  141.         try {

  142.             Column[] columns = _activeMetaData.getColumns();
  143.             for (int i = 0; i < columns.length; i++) {
  144.                 String columnName = columns[i].getColumnName();
  145.                 Object value = values[i];

  146.                 // null
  147.                 if (value == null) {
  148.                     getWriter().write(NULL);
  149.                 }
  150.                 // none
  151.                 else if (value == ITable.NO_VALUE) {
  152.                     getWriter().write(NONE);
  153.                 }
  154.                 // values
  155.                 else {
  156.                     try {
  157.                         String stringValue = DataType.asString(value);
  158.                         final String quoted = quote(stringValue);
  159.                         getWriter().write(quoted);
  160.                     } catch (TypeCastException e) {
  161.                         throw new DataSetException("table=" +
  162.                                 _activeMetaData.getTableName() + ", row=" + i +
  163.                                 ", column=" + columnName +
  164.                                 ", value=" + value, e);
  165.                     }
  166.                 }
  167.                 if (i < columns.length - 1) getWriter().write(",");
  168.             }
  169.             getWriter().write(System.getProperty("line.separator"));
  170.         } catch (IOException e) {
  171.             throw new DataSetException(e);
  172.         }
  173.     }

  174.     private String quote(String stringValue) {
  175.         logger.debug("quote(stringValue={}) - start", stringValue);

  176.         return new StringBuilder(QUOTE).append(escape(stringValue)).append(QUOTE).toString();
  177.     }

  178.     protected static String escape(String stringValue) {
  179.         logger.debug("escape(stringValue={}) - start", stringValue);

  180.         char [] array = stringValue.toCharArray();
  181.         testExport = QUOTE.toCharArray()[0];
  182.         final char escape = ESCAPE.toCharArray()[0];
  183.         StringBuilder buffer = new StringBuilder();
  184.         for (int i = 0; i < array.length; i++) {
  185.             char c = array[i];
  186.             if (c == testExport || c == escape) {
  187.                 buffer.append('\\');
  188.             }
  189.             buffer.append(c);
  190.         }
  191.         return buffer.toString();
  192.     }

  193.     public Writer getWriter() {
  194.         logger.debug("getWriter() - start");

  195.         return writer;
  196.     }

  197.     public void setWriter(Writer writer) {
  198.         logger.debug("setWriter(writer={}) - start", writer);

  199.         this.writer = writer;
  200.     }

  201.     public String getTheDirectory() {
  202.         logger.debug("getTheDirectory() - start");

  203.         return theDirectory;
  204.     }

  205.     public void setTheDirectory(String theDirectory) {
  206.         logger.debug("setTheDirectory(theDirectory={}) - start", theDirectory);

  207.         this.theDirectory = theDirectory;
  208.     }

  209.     public static void write(IDataSet dataset, File dest) throws DataSetException {
  210.         logger.debug("write(dataset={}, dest={}) - start", dataset, dest);

  211.         CsvDataSetWriter writer = new CsvDataSetWriter(dest);
  212.         writer.write(dataset);
  213.     }

  214.     protected void finalize() throws Throwable {
  215.         logger.debug("finalize() - start");

  216.         if (getWriter() != null) {
  217.             getWriter().close();
  218.         }
  219.     }
  220. }