1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.dbunit.ant;
23
24 import java.sql.SQLException;
25 import java.util.ArrayList;
26 import java.util.Iterator;
27 import java.util.List;
28
29 import org.apache.tools.ant.BuildException;
30 import org.apache.tools.ant.ProjectComponent;
31 import org.apache.tools.ant.types.FilterSet;
32 import org.dbunit.database.AmbiguousTableNameException;
33 import org.dbunit.database.IDatabaseConnection;
34 import org.dbunit.database.QueryDataSet;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 public class QuerySet extends ProjectComponent
106 {
107
108
109
110
111 private static final Logger logger = LoggerFactory.getLogger(QuerySet.class);
112
113 private String id;
114 private String refid;
115 private List queries = new ArrayList();
116 private List filterSets = new ArrayList();
117
118 private static String ERR_MSG =
119 "Cannot specify 'id' and 'refid' attributes together in queryset.";
120
121 public QuerySet() {
122 super();
123 }
124
125 public void addQuery(final Query query) {
126 logger.debug("addQuery(query={}) - start", query);
127
128 queries.add(query);
129 }
130
131 public void addFilterSet(final FilterSet filterSet) {
132 logger.debug("addFilterSet(filterSet={}) - start", filterSet);
133
134 filterSets.add(filterSet);
135 }
136
137 public String getId() {
138 return id;
139 }
140
141 public String getRefid() {
142 return refid;
143 }
144
145 public void setId(final String string) throws BuildException {
146 logger.debug("setId(string={}) - start", string);
147
148 if(refid != null) throw new BuildException(ERR_MSG);
149 id = string;
150 }
151
152 public void setRefid(final String string) throws BuildException {
153 logger.debug("setRefid(string={}) - start", string);
154
155 if(id != null) throw new BuildException(ERR_MSG);
156 refid = string;
157 }
158
159 public List getQueries() {
160 logger.debug("getQueries() - start");
161
162 final Iterator i = queries.iterator();
163 while(i.hasNext()) {
164 final Query query = (Query)i.next();
165 replaceTokens(query);
166 }
167
168 return queries;
169
170 }
171
172 private void replaceTokens(final Query query) {
173 logger.debug("replaceTokens(query={}) - start", query);
174
175 final Iterator i = filterSets.iterator();
176 while(i.hasNext()) {
177 final FilterSet filterSet = (FilterSet)i.next();
178 query.setSql(filterSet.replaceTokens(query.getSql()));
179 }
180 }
181
182
183 public void copyQueriesFrom(final QuerySet referenced) {
184 logger.debug("copyQueriesFrom(referenced={}) - start", referenced);
185
186 final Iterator i = referenced.queries.iterator();
187 while(i.hasNext()) {
188 addQuery((Query)i.next());
189 }
190 }
191
192 public QueryDataSet getQueryDataSet(final IDatabaseConnection connection)
193 throws SQLException, AmbiguousTableNameException
194 {
195 logger.debug("getQueryDataSet(connection={}) - start", connection);
196
197
198 final String refid = getRefid();
199 if(refid != null) {
200 final QuerySet referenced = (QuerySet)getProject().getReference(refid);
201 copyQueriesFrom(referenced);
202 }
203
204 final QueryDataSet partialDataSet = new QueryDataSet(connection);
205
206 final Iterator queriesIter = getQueries().iterator();
207 while(queriesIter.hasNext()) {
208 final Query query = (Query)queriesIter.next();
209 partialDataSet.addTable(query.getName(), query.getSql());
210 }
211
212 return partialDataSet;
213
214 }
215
216 }