1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.dbunit.ant;
22
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import org.dbunit.Assertion;
27 import org.dbunit.DatabaseUnitException;
28 import org.dbunit.database.IDatabaseConnection;
29 import org.dbunit.dataset.IDataSet;
30 import org.dbunit.dataset.ITable;
31 import org.dbunit.dataset.NoSuchTableException;
32 import org.dbunit.dataset.SortedTable;
33 import org.dbunit.dataset.ITableMetaData;
34 import org.dbunit.dataset.filter.DefaultColumnFilter;
35
36 import java.io.File;
37 import java.util.ArrayList;
38 import java.util.List;
39
40
41
42
43
44
45
46
47
48
49 public class Compare extends AbstractStep
50 {
51
52
53
54
55 private static final Logger logger = LoggerFactory.getLogger(Compare.class);
56
57 private static final String DEFAULT_FORMAT = FORMAT_FLAT;
58
59 private String _format;
60 private File _src;
61 private List _tables = new ArrayList();
62 private boolean _sort = false;
63
64 public File getSrc()
65 {
66 return _src;
67 }
68
69 public void setSrc(File src)
70 {
71 logger.debug("setSrc(src={}) - start", src);
72
73 _src = src;
74 }
75
76 public void setSort(boolean sort)
77 {
78 logger.debug("setSort(sort={}) - start", String.valueOf(sort));
79
80 _sort = sort;
81 }
82
83 public String getFormat()
84 {
85 return _format != null ? _format : DEFAULT_FORMAT;
86 }
87
88 public void setFormat(String format)
89 {
90 logger.debug("setFormat(format={}) - start", format);
91
92
93 checkDataFormat(format);
94
95 _format = format;
96 }
97
98 public List getTables()
99 {
100 return _tables;
101 }
102
103 public void addTable(Table table)
104 {
105 logger.debug("addTable(table={}) - start", table);
106
107 _tables.add(table);
108 }
109
110 public void addQuery(Query query)
111 {
112 logger.debug("addQuery(query={}) - start", query);
113
114 _tables.add(query);
115 }
116
117 public void execute(IDatabaseConnection connection) throws DatabaseUnitException
118 {
119 logger.debug("execute(connection={}) - start", connection);
120
121 IDataSet expectedDataset = getSrcDataSet(_src, getFormat(), false);
122 IDataSet actualDataset = getDatabaseDataSet(connection, _tables);
123
124 String[] tableNames = null;
125 if (_tables.size() == 0)
126 {
127
128
129 tableNames = expectedDataset.getTableNames();
130 }
131 else
132 {
133 tableNames = actualDataset.getTableNames();
134 }
135
136 for (int i = 0; i < tableNames.length; i++)
137 {
138 String tableName = tableNames[i];
139 ITable expectedTable;
140 try {
141 expectedTable = expectedDataset.getTable(tableName);
142 } catch (NoSuchTableException e) {
143 throw new DatabaseUnitException("Did not find table in source file '" +
144 _src + "' using format '" + getFormat() + "'", e);
145 }
146 ITableMetaData expectedMetaData = expectedTable.getTableMetaData();
147
148 ITable actualTable;
149 try {
150 actualTable = actualDataset.getTable(tableName);
151 } catch (NoSuchTableException e) {
152 throw new DatabaseUnitException("Did not find table in actual dataset '" +
153 actualDataset + "' via db connection '" + connection + "'", e);
154 }
155
156
157 actualTable = DefaultColumnFilter.includedColumnsTable(
158 actualTable, expectedMetaData.getColumns());
159
160 if (_sort)
161 {
162 expectedTable = new SortedTable(expectedTable);
163 actualTable = new SortedTable(actualTable);
164 }
165 Assertion.assertEquals(expectedTable, actualTable);
166 }
167 }
168
169 public String getLogMessage()
170 {
171 return "Executing compare: "
172 + "\n from file: " + ((_src == null) ? null : _src.getAbsolutePath())
173 + "\n with format: " + _format;
174 }
175
176 public String toString()
177 {
178 StringBuilder result = new StringBuilder();
179 result.append("Compare: ");
180 result.append(" src=");
181 result.append((_src == null ? "null" : _src.getAbsolutePath()));
182 result.append(", format= ");
183 result.append(_format);
184 result.append(", tables= ");
185 result.append(_tables);
186
187 return result.toString();
188 }
189 }
190