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.xml;
22
23 import java.io.IOException;
24 import java.io.OutputStream;
25 import java.io.UnsupportedEncodingException;
26 import java.io.Writer;
27 import java.nio.charset.Charset;
28
29 import org.dbunit.dataset.Column;
30 import org.dbunit.dataset.DataSetException;
31 import org.dbunit.dataset.IDataSet;
32 import org.dbunit.dataset.ITableMetaData;
33 import org.dbunit.dataset.datatype.DataType;
34 import org.dbunit.dataset.datatype.TypeCastException;
35 import org.dbunit.dataset.stream.DataSetProducerAdapter;
36 import org.dbunit.dataset.stream.IDataSetConsumer;
37 import org.dbunit.util.xml.XmlWriter;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40
41
42
43
44
45
46
47 public class FlatXmlWriter implements IDataSetConsumer
48 {
49
50
51
52
53 private static final Logger logger = LoggerFactory.getLogger(FlatXmlWriter.class);
54
55 private static final String DATASET = "dataset";
56
57 private XmlWriter _xmlWriter;
58 private ITableMetaData _activeMetaData;
59 private int _activeRowCount;
60 private boolean _includeEmptyTable = false;
61 private String _systemId = null;
62
63 public FlatXmlWriter(OutputStream out) throws IOException
64 {
65 this(out, null);
66 }
67
68
69
70
71
72
73
74 public FlatXmlWriter(OutputStream outputStream, Charset charset)
75 {
76 _xmlWriter = new XmlWriter(outputStream, charset);
77 _xmlWriter.enablePrettyPrint(true);
78 }
79
80 public FlatXmlWriter(Writer writer)
81 {
82 _xmlWriter = new XmlWriter(writer);
83 _xmlWriter.enablePrettyPrint(true);
84 }
85
86 public FlatXmlWriter(Writer writer, Charset charset)
87 {
88 _xmlWriter = new XmlWriter(writer, charset);
89 _xmlWriter.enablePrettyPrint(true);
90 }
91
92 public void setIncludeEmptyTable(boolean includeEmptyTable)
93 {
94 _includeEmptyTable = includeEmptyTable;
95 }
96
97 public void setDocType(String systemId)
98 {
99 _systemId = systemId;
100 }
101
102
103
104
105
106
107
108 public void setPrettyPrint(boolean enabled)
109 {
110 _xmlWriter.enablePrettyPrint(enabled);
111 }
112
113
114
115
116
117
118 public void write(IDataSet dataSet) throws DataSetException
119 {
120 logger.debug("write(dataSet={}) - start", dataSet);
121
122 DataSetProducerAdapter provider = new DataSetProducerAdapter(dataSet);
123 provider.setConsumer(this);
124 provider.produce();
125 }
126
127
128
129
130 public void startDataSet() throws DataSetException
131 {
132 logger.debug("startDataSet() - start");
133
134 try
135 {
136 _xmlWriter.writeDeclaration();
137 _xmlWriter.writeDoctype(_systemId, null);
138 _xmlWriter.writeElement(DATASET);
139 }
140 catch (IOException e)
141 {
142 throw new DataSetException(e);
143 }
144 }
145
146 public void endDataSet() throws DataSetException
147 {
148 logger.debug("endDataSet() - start");
149
150 try
151 {
152 _xmlWriter.endElement();
153 _xmlWriter.close();
154 }
155 catch (IOException e)
156 {
157 throw new DataSetException(e);
158 }
159 }
160
161 public void startTable(ITableMetaData metaData) throws DataSetException
162 {
163 logger.debug("startTable(metaData={}) - start", metaData);
164
165 _activeMetaData = metaData;
166 _activeRowCount = 0;
167 }
168
169 public void endTable() throws DataSetException
170 {
171 logger.debug("endTable() - start");
172
173 if (_includeEmptyTable && _activeRowCount == 0)
174 {
175 try
176 {
177 String tableName = _activeMetaData.getTableName();
178 _xmlWriter.writeEmptyElement(tableName);
179 }
180 catch (IOException e)
181 {
182 throw new DataSetException(e);
183 }
184 }
185
186 _activeMetaData = null;
187 }
188
189 public void row(Object[] values) throws DataSetException
190 {
191 logger.debug("row(values={}) - start", values);
192
193 try
194 {
195 String tableName = _activeMetaData.getTableName();
196 _xmlWriter.writeElement(tableName);
197
198 Column[] columns = _activeMetaData.getColumns();
199 for (int i = 0; i < columns.length; i++)
200 {
201 String columnName = columns[i].getColumnName();
202 Object value = values[i];
203
204
205 if (value == null)
206 {
207 continue;
208 }
209
210 try
211 {
212 String stringValue = DataType.asString(value);
213 _xmlWriter.writeAttribute(columnName, stringValue, true);
214 }
215 catch (TypeCastException e)
216 {
217 throw new DataSetException("table=" +
218 _activeMetaData.getTableName() + ", row=" + i +
219 ", column=" + columnName +
220 ", value=" + value, e);
221 }
222 }
223
224 _activeRowCount++;
225 _xmlWriter.endElement();
226 }
227 catch (IOException e)
228 {
229 throw new DataSetException(e);
230 }
231 }
232 }