1 package org.apache.torque.om.mapper;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.InputStream;
23 import java.io.Reader;
24 import java.math.BigDecimal;
25 import java.net.URL;
26 import java.sql.Array;
27 import java.sql.Blob;
28 import java.sql.Clob;
29 import java.sql.Date;
30 import java.sql.Ref;
31 import java.sql.ResultSet;
32 import java.sql.SQLException;
33 import java.sql.Time;
34 import java.sql.Timestamp;
35 import java.util.ArrayList;
36 import java.util.List;
37
38 import org.apache.torque.TorqueException;
39
40
41
42
43
44
45
46
47 public class ObjectListMapper implements RecordMapper<List<Object>>
48 {
49
50 private static final long serialVersionUID = 1L;
51
52
53 private static final byte ZERO_BYTE = 0;
54
55
56 private static final short ZERO_SHORT = 0;
57
58
59
60
61
62 private List<Class<?>> convertClasses = null;
63
64
65
66
67
68
69
70 public ObjectListMapper()
71 {
72
73 }
74
75
76
77
78
79
80
81
82
83
84
85 public ObjectListMapper(int numberOfColumnsToMap)
86 {
87 this.convertClasses = new ArrayList<Class<?>>(numberOfColumnsToMap);
88 if (numberOfColumnsToMap != -1)
89 {
90 for (int i = 0; i < numberOfColumnsToMap; ++i)
91 {
92 convertClasses.add(Object.class);
93 }
94 }
95 }
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 public ObjectListMapper(List<Class<?>> convertClasses)
113 {
114 if (convertClasses != null)
115 {
116 this.convertClasses = new ArrayList<Class<?>>(convertClasses);
117 }
118 }
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 public List<Object> processRow(ResultSet resultSet, int offset)
136 throws TorqueException
137 {
138 try
139 {
140 int currentNumberOfColumnsToMap;
141 if (convertClasses != null)
142 {
143 currentNumberOfColumnsToMap = convertClasses.size();
144 }
145 else
146 {
147 int resultSetLength = resultSet.getMetaData().getColumnCount();
148 currentNumberOfColumnsToMap = resultSetLength - offset;
149 }
150
151 List<Object> result
152 = new ArrayList<Object>(currentNumberOfColumnsToMap);
153 for (int i = 0; i < currentNumberOfColumnsToMap; ++i)
154 {
155 Class<?> mapClass;
156 if (convertClasses != null)
157 {
158 mapClass = convertClasses.get(i);
159 }
160 else
161 {
162 mapClass = Object.class;
163 }
164 Object columnValue;
165 int columnIndex = i + offset + 1;
166 if (mapClass.equals(Array.class))
167 {
168 columnValue = resultSet.getArray(columnIndex);
169 }
170 else if (mapClass.equals(BigDecimal.class))
171 {
172 columnValue = resultSet.getBigDecimal(columnIndex);
173 }
174 else if (mapClass.equals(InputStream.class))
175 {
176 columnValue = resultSet.getBinaryStream(columnIndex);
177 }
178 else if (mapClass.equals(Blob.class))
179 {
180 columnValue = resultSet.getBlob(columnIndex);
181 }
182 else if (mapClass.equals(Boolean.class))
183 {
184 columnValue = resultSet.getBoolean(columnIndex);
185 }
186 else if (mapClass.equals(Byte.class))
187 {
188 columnValue = resultSet.getByte(columnIndex);
189 if (Byte.valueOf(ZERO_BYTE).equals(columnValue)
190 && resultSet.wasNull())
191 {
192 columnValue = null;
193 }
194 }
195 else if (mapClass.equals(byte[].class))
196 {
197 columnValue = resultSet.getBytes(columnIndex);
198 }
199 else if (mapClass.equals(Reader.class))
200 {
201 columnValue = resultSet.getCharacterStream(columnIndex);
202 }
203 else if (mapClass.equals(Clob.class))
204 {
205 columnValue = resultSet.getClob(columnIndex);
206 }
207 else if (mapClass.equals(Date.class))
208 {
209 columnValue = resultSet.getDate(columnIndex);
210 }
211 else if (mapClass.equals(Double.class))
212 {
213 columnValue = resultSet.getDouble(columnIndex);
214 if (Double.valueOf(0d).equals(columnValue)
215 && resultSet.wasNull())
216 {
217 columnValue = null;
218 }
219 }
220 else if (mapClass.equals(Float.class))
221 {
222 columnValue = resultSet.getFloat(columnIndex);
223 if (Float.valueOf(0f).equals(columnValue)
224 && resultSet.wasNull())
225 {
226 columnValue = null;
227 }
228 }
229 else if (mapClass.equals(Integer.class))
230 {
231 columnValue = resultSet.getInt(columnIndex);
232 if (Integer.valueOf(0).equals(columnValue)
233 && resultSet.wasNull())
234 {
235 columnValue = null;
236 }
237 }
238 else if (mapClass.equals(Long.class))
239 {
240 columnValue = resultSet.getLong(columnIndex);
241 if (Long.valueOf(0L).equals(columnValue)
242 && resultSet.wasNull())
243 {
244 columnValue = null;
245 }
246 }
247 else if (mapClass.equals(Object.class))
248 {
249 columnValue = resultSet.getObject(columnIndex);
250 }
251 else if (mapClass.equals(Ref.class))
252 {
253 columnValue = resultSet.getRef(columnIndex);
254 }
255 else if (mapClass.equals(Short.class))
256 {
257 columnValue = resultSet.getShort(columnIndex);
258 if (Short.valueOf(ZERO_SHORT).equals(columnValue)
259 && resultSet.wasNull())
260 {
261 columnValue = null;
262 }
263 }
264 else if (mapClass.equals(String.class))
265 {
266 columnValue = resultSet.getString(columnIndex);
267 }
268 else if (mapClass.equals(Time.class))
269 {
270 columnValue = resultSet.getTime(columnIndex);
271 }
272 else if (mapClass.equals(Timestamp.class))
273 {
274 columnValue = resultSet.getTimestamp(columnIndex);
275 }
276 else if (mapClass.equals(URL.class))
277 {
278 columnValue = resultSet.getURL(columnIndex);
279 }
280 else
281 {
282 throw new IllegalArgumentException(
283 "Unknown convertClass " + mapClass.getName()
284 + " at position " + i);
285 }
286 result.add(columnValue);
287 }
288 return result;
289 }
290 catch (SQLException e)
291 {
292 throw new TorqueException(e);
293 }
294 }
295 }
296