001 /**
002
003 * ========================================
004
005 * JFreeReport : a free Java report library
006
007 * ========================================
008
009 *
010
011 * Project Info: http://reporting.pentaho.org/
012
013 *
014
015 * (C) Copyright 2000-2007, by Object Refinery Limited, Pentaho Corporation and Contributors.
016
017 *
018
019 * This library is free software; you can redistribute it and/or modify it under the terms
020
021 * of the GNU Lesser General Public License as published by the Free Software Foundation;
022
023 * either version 2.1 of the License, or (at your option) any later version.
024
025 *
026
027 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
028
029 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
030
031 * See the GNU Lesser General Public License for more details.
032
033 *
034
035 * You should have received a copy of the GNU Lesser General Public License along with this
036
037 * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
038
039 * Boston, MA 02111-1307, USA.
040
041 *
042
043 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
044
045 * in the United States and other countries.]
046
047 *
048
049 * ------------
050
051 * $Id: TypeMapper.java,v 1.8 2007/04/01 18:49:32 taqua Exp $
052
053 * ------------
054
055 * (C) Copyright 2000-2005, by Object Refinery Limited.
056
057 * (C) Copyright 2005-2007, by Pentaho Corporation.
058
059 */
060
061 package org.jfree.report.modules.misc.tablemodel;
062
063
064
065 import java.sql.Blob;
066
067 import java.sql.Clob;
068
069 import java.sql.Ref;
070
071 import java.sql.ResultSetMetaData;
072
073 import java.sql.SQLException;
074
075 import java.sql.Struct;
076
077 import java.sql.Time;
078
079 import java.sql.Timestamp;
080
081 import java.sql.Types;
082
083
084
085 import org.jfree.util.ObjectUtilities;
086
087
088
089 /**
090
091 * @author $Author: taqua $
092
093 * @version $Id: TypeMapper.java,v 1.8 2007/04/01 18:49:32 taqua Exp $
094
095 */
096
097 public class TypeMapper
098
099 {
100
101 private static Class byteArrayClass = (new byte[0]).getClass();
102
103
104
105 private static Class mapSQLType (final int t)
106
107 {
108
109 switch (t)
110
111 {
112
113 case Types.ARRAY:
114
115 return (new Object[0]).getClass();
116
117 case Types.BIGINT:
118
119 return Long.class;
120
121 case Types.BINARY:
122
123 return byteArrayClass;
124
125 case Types.BIT:
126
127 return Boolean.class;
128
129 case Types.BLOB:
130
131 return Blob.class;
132
133 case 16: // Types.BOOLEAN was not part of JDK1.2.2
134
135 return Boolean.class;
136
137 case Types.CHAR:
138
139 return String.class;
140
141 case Types.CLOB:
142
143 return Clob.class;
144
145 case 70: // Types.DATALINK was not part of JDK 1.2.2
146
147 return Object.class;
148
149 case Types.DATE:
150
151 return java.sql.Date.class;
152
153 case Types.DECIMAL:
154
155 return java.math.BigDecimal.class;
156
157 case Types.DISTINCT:
158
159 return Object.class;
160
161 case Types.DOUBLE:
162
163 return Double.class;
164
165 case Types.FLOAT:
166
167 return Double.class;
168
169 case Types.INTEGER:
170
171 return Integer.class;
172
173 case Types.JAVA_OBJECT:
174
175 return Object.class;
176
177 case Types.LONGVARBINARY:
178
179 return byteArrayClass;
180
181 case Types.LONGVARCHAR:
182
183 return String.class;
184
185 case Types.NULL:
186
187 return Object.class;
188
189 case Types.NUMERIC:
190
191 return java.math.BigDecimal.class;
192
193 case Types.OTHER:
194
195 return Object.class;
196
197 case Types.REAL:
198
199 return Float.class;
200
201 case Types.REF:
202
203 return Ref.class;
204
205 case Types.SMALLINT:
206
207 return Short.class;
208
209 case Types.STRUCT:
210
211 return Struct.class;
212
213 case Types.TIME:
214
215 return Time.class;
216
217 case Types.TIMESTAMP:
218
219 return Timestamp.class;
220
221 case Types.TINYINT:
222
223 return Byte.class;
224
225 case Types.VARBINARY:
226
227 return byteArrayClass;
228
229 case Types.VARCHAR:
230
231 return String.class;
232
233 default:
234
235 return Object.class;
236
237 }
238
239 }
240
241
242
243 public static Class[] mapTypes (final ResultSetMetaData rsmd)
244
245 {
246
247 final Class[] types;
248
249 try
250
251 {
252
253 types = new Class[rsmd.getColumnCount()];
254
255 }
256
257 catch (SQLException sqle)
258
259 {
260
261 return null;
262
263 }
264
265
266
267 final ClassLoader cl = ObjectUtilities.getClassLoader(TypeMapper.class);
268
269 for (int i = 0; i < types.length; i++)
270
271 {
272
273 try
274
275 {
276
277 try
278
279 {
280
281 final String tn = rsmd.getColumnClassName(i + 1);
282
283 types[i] = cl.loadClass(tn);
284
285 }
286
287 catch (Exception oops)
288
289 {
290
291 final int colType = rsmd.getColumnType(i + 1);
292
293 types[i] = mapSQLType(colType);
294
295 }
296
297 }
298
299 catch (Exception e)
300
301 {
302
303 types[i] = Object.class;
304
305 }
306
307 }
308
309
310
311 return types;
312
313 }
314
315
316
317 private TypeMapper ()
318
319 {
320
321 }
322
323 }
324