1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.dbunit.database;
22
23 import java.sql.SQLException;
24 import java.util.List;
25
26 import org.dbunit.database.QueryDataSet.TableEntry;
27 import org.dbunit.dataset.DataSetException;
28 import org.dbunit.dataset.ITable;
29 import org.dbunit.dataset.ITableIterator;
30 import org.dbunit.dataset.ITableMetaData;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34
35
36
37
38
39
40
41
42
43
44 public class QueryTableIterator implements ITableIterator
45 {
46
47
48
49
50 private static final Logger logger = LoggerFactory.getLogger(QueryTableIterator.class);
51
52 private final List _tableEntries;
53 private final IDatabaseConnection _connection;
54 private IResultSetTable _currentTable;
55 private int _index = -1;
56
57
58
59
60
61 public QueryTableIterator(List tableEntries, IDatabaseConnection connection)
62 {
63 if (tableEntries == null) {
64 throw new NullPointerException(
65 "The parameter 'tableEntries' must not be null");
66 }
67 if (connection == null) {
68 throw new NullPointerException(
69 "The parameter 'connection' must not be null");
70 }
71
72 _tableEntries = tableEntries;
73 _connection = connection;
74 _currentTable = null;
75 }
76
77
78
79
80
81
82
83 public boolean next() throws DataSetException
84 {
85 logger.debug("next() - start");
86
87 _index++;
88
89
90 if (_currentTable != null)
91 {
92 _currentTable.close();
93 _currentTable = null;
94 }
95
96 return _index < _tableEntries.size();
97 }
98
99 public boolean nextWithoutClosing()
100 {
101 _index++;
102 _currentTable = null;
103
104 return _index < _tableEntries.size();
105 }
106
107
108
109
110 public ITableMetaData getTableMetaData() throws DataSetException
111 {
112 logger.debug("getTableMetaData() - start");
113
114 QueryDataSet.TableEntry entry = (QueryDataSet.TableEntry)_tableEntries.get(_index);
115
116
117 if (entry.getQuery() == null)
118 {
119 try
120 {
121 ITable table = _connection.createTable(entry.getTableName());
122 return table.getTableMetaData();
123 }
124 catch (SQLException e)
125 {
126 throw new DataSetException(e);
127 }
128 }
129 else
130 {
131 return getTable().getTableMetaData();
132 }
133 }
134
135
136
137
138 public ITable getTable() throws DataSetException
139 {
140 logger.debug("getTable() - start");
141
142 if (_currentTable == null)
143 {
144 try
145 {
146 QueryDataSet.TableEntry entry = (QueryDataSet.TableEntry)_tableEntries.get(_index);
147
148
149 if (entry.getQuery() == null)
150 {
151 _currentTable = (IResultSetTable)_connection.createTable(entry.getTableName());
152 }
153 else
154 {
155 DatabaseConfig config = _connection.getConfig();
156 IResultSetTableFactory factory = (IResultSetTableFactory)config.getProperty(
157 DatabaseConfig.PROPERTY_RESULTSET_TABLE_FACTORY);
158
159 _currentTable = factory.createTable(entry.getTableName(), entry.getQuery(), _connection);
160 }
161 }
162 catch (SQLException e)
163 {
164 throw new DataSetException(e);
165 }
166 }
167 return _currentTable;
168 }
169 }