1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.dbunit.dataset.csv;
22
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import java.io.IOException;
27 import java.net.URL;
28 import java.util.Iterator;
29 import java.util.List;
30
31 import org.dbunit.dataset.Column;
32 import org.dbunit.dataset.DataSetException;
33 import org.dbunit.dataset.DefaultTableMetaData;
34 import org.dbunit.dataset.ITableMetaData;
35 import org.dbunit.dataset.datatype.DataType;
36 import org.dbunit.dataset.stream.DefaultConsumer;
37 import org.dbunit.dataset.stream.IDataSetConsumer;
38 import org.dbunit.dataset.stream.IDataSetProducer;
39
40
41
42
43
44
45
46
47
48
49
50
51
52 public class CsvURLProducer implements IDataSetProducer {
53
54
55
56
57 private static final Logger logger = LoggerFactory.getLogger(CsvURLProducer.class);
58
59
60 private static final IDataSetConsumer EMPTY_CONSUMER = new DefaultConsumer();
61
62
63
64
65
66 private IDataSetConsumer _consumer = EMPTY_CONSUMER;
67
68
69 private URL base;
70
71
72 private String tableList;
73
74
75
76
77
78
79
80 public CsvURLProducer(URL base, String tableList)
81 {
82 this.base = base;
83 this.tableList = tableList;
84 }
85
86
87
88
89 public void setConsumer(IDataSetConsumer consumer) throws DataSetException {
90 logger.debug("setConsumer(consumer) - start");
91
92 _consumer = consumer;
93 }
94
95
96
97
98 public void produce() throws DataSetException {
99 logger.debug("produce() - start");
100
101 _consumer.startDataSet();
102 try {
103 List tableSpecs = CsvProducer.getTables(base, tableList);
104 for (Iterator tableIter = tableSpecs.iterator(); tableIter.hasNext();) {
105 String table = (String) tableIter.next();
106 try {
107 produceFromURL(new URL(base, table + ".csv"));
108 } catch (CsvParserException e) {
109 throw new DataSetException("error producing dataset for table '" + table + "'", e);
110 }
111
112 }
113 _consumer.endDataSet();
114 } catch (IOException e) {
115 throw new DataSetException("error getting list of tables", e);
116 }
117 }
118
119
120
121
122
123
124 private void produceFromURL(URL url) throws DataSetException {
125 logger.debug("produceFromURL(url=" + url + ") - start");
126
127 try {
128 CsvParser parser = new CsvParserImpl();
129 List readData = parser.parse(url);
130 List readColumns = (List) readData.get(0);
131 Column[] columns = new Column[readColumns.size()];
132
133 for (int i = 0; i < readColumns.size(); i++) {
134 columns[i] = new Column((String) readColumns.get(i), DataType.UNKNOWN);
135 }
136
137 String tableName = url.getFile();
138 tableName = tableName.substring(tableName.lastIndexOf("/")+1, tableName.indexOf(".csv"));
139 ITableMetaData metaData = new DefaultTableMetaData(tableName, columns);
140 _consumer.startTable(metaData);
141 for (int i = 1 ; i < readData.size(); i++) {
142 List rowList = (List)readData.get(i);
143 Object[] row = rowList.toArray();
144 for(int col = 0; col < row.length; col++) {
145 if (CsvDataSetWriter.NULL.equals(row[col])) {
146 row[col] = null;
147 }
148 }
149 _consumer.row(row);
150 }
151 _consumer.endTable();
152 } catch (CsvParserException e) {
153 throw new DataSetException("error parsing CSV for URL: '" + url + "'");
154 } catch (IOException e) {
155 throw new DataSetException("I/O error parsing CSV for URL: '" + url + "'");
156 }
157 }
158 }