KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > beehive > controls > system > jdbc > TypeMappingsFactory


1 /*
2  * Copyright 2005 The Apache Software Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * $Header:$
17  */

18
19 package org.apache.beehive.controls.system.jdbc;
20
21 import org.apache.beehive.controls.api.ControlException;
22
23 import java.lang.reflect.Method JavaDoc;
24 import java.lang.reflect.InvocationTargetException JavaDoc;
25 import java.sql.Types JavaDoc;
26 import java.sql.Blob JavaDoc;
27 import java.sql.Clob JavaDoc;
28 import java.util.HashMap JavaDoc;
29 import java.util.Map JavaDoc;
30
31 /**
32  * Currently contains all types of type mappings. Implemented using singleton pattern.
33  */

34 //@todo: refactor!
35
public final class TypeMappingsFactory {
36
37
38     private static TypeMappingsFactory _instance;
39
40     /**
41      * Get an instance of this class.
42      * @return TypeMappingsFactory instance.
43      */

44     public static TypeMappingsFactory getInstance() {
45         if (_instance == null) {
46             _instance = new TypeMappingsFactory();
47         }
48         return _instance;
49     }
50
51     public static final int TYPE_UNKNOWN = 0;
52     static final int TYPE_BYTE = 1;
53     static final int TYPE_SHORT = 2;
54     static final int TYPE_INT = 3;
55     static final int TYPE_LONG = 4;
56     static final int TYPE_FLOAT = 5;
57     static final int TYPE_DOUBLE = 6;
58     static final int TYPE_BOOLEAN = 7;
59     static final int TYPE_BYTE_OBJ = 8;
60     static final int TYPE_SHORT_OBJ = 9;
61     static final int TYPE_INT_OBJ = 10;
62     static final int TYPE_LONG_OBJ = 11;
63     static final int TYPE_FLOAT_OBJ = 12;
64     static final int TYPE_DOUBLE_OBJ = 13;
65     static final int TYPE_BOOLEAN_OBJ = 14;
66     static final int TYPE_BIG_DECIMAL = 15;
67     static final int TYPE_STRING = 16;
68     static final int TYPE_BYTES = 17;
69     static final int TYPE_SQLDATE = 18;
70     static final int TYPE_TIME = 19;
71     static final int TYPE_TIMESTAMP = 20;
72     static final int TYPE_STREAM = 21;
73     static final int TYPE_READER = 22;
74     static final int TYPE_CLOB = 23;
75     static final int TYPE_BLOB = 24;
76     static final int TYPE_ARRAY = 25;
77     static final int TYPE_REF = 26;
78     static final int TYPE_DATE = 27;
79     static final int TYPE_CALENDAR = 28;
80     static final int TYPE_STRUCT = 29;
81     static final int TYPE_XMLBEAN_ENUM = 30;
82     static final int TYPE_MAX = 31;
83
84     private Map JavaDoc<Class JavaDoc, Object JavaDoc> _primitiveDefaults;
85
86     //
87
// keys in this map are the class of the method's return type,
88
// values are the set of constants defined above all prefixed with
89
// TYPE_
90
//
91
private Map JavaDoc<Class JavaDoc, Integer JavaDoc> _typeMap;
92     private Map JavaDoc<Class JavaDoc, Integer JavaDoc> _typeSqlMap;
93
94     /**
95      * Map a string version of sql type to sql type (java.sql.Types).
96      * example: "INTEGER" maps to java.sql.Types.INTEGER
97      */

98     private Map JavaDoc<String JavaDoc, Integer JavaDoc> _typeSqlNameMap;
99
100     private static Method JavaDoc _methodMapGet;
101
102     /**
103      * Constructor
104      */

105     TypeMappingsFactory() {
106
107         _primitiveDefaults = new HashMap JavaDoc<Class JavaDoc, Object JavaDoc>();
108         _primitiveDefaults.put(Boolean.TYPE, Boolean.FALSE);
109         _primitiveDefaults.put(Integer.TYPE, new Integer JavaDoc(0));
110         _primitiveDefaults.put(Long.TYPE, new Long JavaDoc(0));
111         _primitiveDefaults.put(Byte.TYPE, new Byte JavaDoc((byte) 0));
112         _primitiveDefaults.put(Short.TYPE, new Short JavaDoc((short) 0));
113         _primitiveDefaults.put(Character.TYPE, new Character JavaDoc('\u0000'));
114         _primitiveDefaults.put(Float.TYPE, new Float JavaDoc(0.0f));
115         _primitiveDefaults.put(Double.TYPE, new Double JavaDoc(0.0d));
116
117         // Class to internal enum
118
_typeMap = new HashMap JavaDoc<Class JavaDoc, Integer JavaDoc>(TYPE_MAX * 2);
119         _typeMap.put(Boolean.TYPE, new Integer JavaDoc(TYPE_BOOLEAN));
120         _typeMap.put(Integer.TYPE, new Integer JavaDoc(TYPE_INT));
121         _typeMap.put(Long.TYPE, new Integer JavaDoc(TYPE_LONG));
122         _typeMap.put(Byte.TYPE, new Integer JavaDoc(TYPE_BYTE));
123         _typeMap.put(Short.TYPE, new Integer JavaDoc(TYPE_SHORT));
124         _typeMap.put(Float.TYPE, new Integer JavaDoc(TYPE_FLOAT));
125         _typeMap.put(Double.TYPE, new Integer JavaDoc(TYPE_DOUBLE));
126         _typeMap.put(Boolean JavaDoc.class, new Integer JavaDoc(TYPE_BOOLEAN_OBJ));
127         _typeMap.put(Integer JavaDoc.class, new Integer JavaDoc(TYPE_INT_OBJ));
128         _typeMap.put(Long JavaDoc.class, new Integer JavaDoc(TYPE_LONG_OBJ));
129         _typeMap.put(Byte JavaDoc.class, new Integer JavaDoc(TYPE_BYTE_OBJ));
130         _typeMap.put(Short JavaDoc.class, new Integer JavaDoc(TYPE_SHORT_OBJ));
131         _typeMap.put(Float JavaDoc.class, new Integer JavaDoc(TYPE_FLOAT_OBJ));
132         _typeMap.put(Double JavaDoc.class, new Integer JavaDoc(TYPE_DOUBLE_OBJ));
133         _typeMap.put(String JavaDoc.class, new Integer JavaDoc(TYPE_STRING));
134         _typeMap.put(java.math.BigDecimal JavaDoc.class, new Integer JavaDoc(TYPE_BIG_DECIMAL));
135         _typeMap.put(byte[].class, new Integer JavaDoc(TYPE_BYTES));
136         _typeMap.put(java.sql.Timestamp JavaDoc.class, new Integer JavaDoc(TYPE_TIMESTAMP));
137         _typeMap.put(java.sql.Time JavaDoc.class, new Integer JavaDoc(TYPE_TIME));
138         _typeMap.put(java.sql.Date JavaDoc.class, new Integer JavaDoc(TYPE_SQLDATE));
139         _typeMap.put(java.sql.Ref JavaDoc.class, new Integer JavaDoc(TYPE_REF));
140         _typeMap.put(java.sql.Blob JavaDoc.class, new Integer JavaDoc(TYPE_BLOB));
141         _typeMap.put(java.sql.Clob JavaDoc.class, new Integer JavaDoc(TYPE_CLOB));
142         _typeMap.put(java.sql.Array JavaDoc.class, new Integer JavaDoc(TYPE_ARRAY));
143         _typeMap.put(java.sql.Struct JavaDoc.class, new Integer JavaDoc(TYPE_STRUCT));
144         _typeMap.put(java.io.Reader JavaDoc.class, new Integer JavaDoc(TYPE_READER));
145         _typeMap.put(java.io.InputStream JavaDoc.class, new Integer JavaDoc(TYPE_STREAM));
146         _typeMap.put(java.util.Date JavaDoc.class, new Integer JavaDoc(TYPE_DATE));
147         _typeMap.put(java.util.Calendar JavaDoc.class, new Integer JavaDoc(TYPE_CALENDAR));
148         _typeMap.put(java.util.GregorianCalendar JavaDoc.class, new Integer JavaDoc(TYPE_CALENDAR));
149         _typeMap.put(org.apache.xmlbeans.StringEnumAbstractBase.class, new Integer JavaDoc(TYPE_XMLBEAN_ENUM));
150
151         // Class to java.sql.Types
152
_typeSqlMap = new HashMap JavaDoc<Class JavaDoc, Integer JavaDoc>(TYPE_MAX * 2);
153         _typeSqlMap.put(Boolean.TYPE, new Integer JavaDoc(Types.BOOLEAN));
154         _typeSqlMap.put(Integer.TYPE, new Integer JavaDoc(Types.INTEGER));
155         _typeSqlMap.put(Long.TYPE, new Integer JavaDoc(Types.BIGINT));
156         _typeSqlMap.put(Byte.TYPE, new Integer JavaDoc(Types.TINYINT));
157         _typeSqlMap.put(Short.TYPE, new Integer JavaDoc(Types.SMALLINT));
158         _typeSqlMap.put(Float.TYPE, new Integer JavaDoc(Types.REAL));
159         _typeSqlMap.put(Double.TYPE, new Integer JavaDoc(Types.DOUBLE));
160         _typeSqlMap.put(Boolean JavaDoc.class, new Integer JavaDoc(Types.BOOLEAN));
161         _typeSqlMap.put(Integer JavaDoc.class, new Integer JavaDoc(Types.INTEGER));
162         _typeSqlMap.put(Long JavaDoc.class, new Integer JavaDoc(Types.BIGINT));
163         _typeSqlMap.put(Byte JavaDoc.class, new Integer JavaDoc(Types.TINYINT));
164         _typeSqlMap.put(Short JavaDoc.class, new Integer JavaDoc(Types.SMALLINT));
165         _typeSqlMap.put(Float JavaDoc.class, new Integer JavaDoc(Types.REAL));
166         _typeSqlMap.put(Double JavaDoc.class, new Integer JavaDoc(Types.DOUBLE));
167         _typeSqlMap.put(String JavaDoc.class, new Integer JavaDoc(Types.VARCHAR));
168         _typeSqlMap.put(java.math.BigDecimal JavaDoc.class, new Integer JavaDoc(Types.DECIMAL));
169         _typeSqlMap.put(byte[].class, new Integer JavaDoc(Types.VARBINARY));
170         _typeSqlMap.put(java.sql.Timestamp JavaDoc.class, new Integer JavaDoc(Types.TIMESTAMP));
171         _typeSqlMap.put(java.sql.Time JavaDoc.class, new Integer JavaDoc(Types.TIME));
172         _typeSqlMap.put(java.sql.Date JavaDoc.class, new Integer JavaDoc(Types.DATE));
173         _typeSqlMap.put(java.sql.Ref JavaDoc.class, new Integer JavaDoc(Types.REF));
174         _typeSqlMap.put(java.sql.Blob JavaDoc.class, new Integer JavaDoc(Types.BLOB));
175         _typeSqlMap.put(java.sql.Clob JavaDoc.class, new Integer JavaDoc(Types.CLOB));
176         _typeSqlMap.put(java.sql.Array JavaDoc.class, new Integer JavaDoc(Types.ARRAY));
177         _typeSqlMap.put(java.sql.Struct JavaDoc.class, new Integer JavaDoc(Types.STRUCT));
178         _typeSqlMap.put(java.util.Date JavaDoc.class, new Integer JavaDoc(Types.TIMESTAMP));
179         _typeSqlMap.put(java.util.Calendar JavaDoc.class, new Integer JavaDoc(Types.TIMESTAMP));
180         _typeSqlMap.put(java.util.GregorianCalendar JavaDoc.class, new Integer JavaDoc(Types.TIMESTAMP));
181         _typeSqlMap.put(org.apache.xmlbeans.StringEnumAbstractBase.class, new Integer JavaDoc(Types.VARCHAR));
182
183         // String to java.sql.Types
184
_typeSqlNameMap = new HashMap JavaDoc<String JavaDoc, Integer JavaDoc>(TYPE_MAX * 2);
185         _typeSqlNameMap.put("BIT", new Integer JavaDoc(Types.BIT));
186         _typeSqlNameMap.put("TINYINT", new Integer JavaDoc(Types.TINYINT));
187         _typeSqlNameMap.put("SMALLINT", new Integer JavaDoc(Types.SMALLINT));
188         _typeSqlNameMap.put("INTEGER", new Integer JavaDoc(Types.INTEGER));
189         _typeSqlNameMap.put("BIGINT", new Integer JavaDoc(Types.BIGINT));
190         _typeSqlNameMap.put("FLOAT", new Integer JavaDoc(Types.REAL));
191         _typeSqlNameMap.put("REAL", new Integer JavaDoc(Types.REAL));
192         _typeSqlNameMap.put("DOUBLE", new Integer JavaDoc(Types.DOUBLE));
193         _typeSqlNameMap.put("NUMERIC", new Integer JavaDoc(Types.NUMERIC));
194         _typeSqlNameMap.put("DECIMAL", new Integer JavaDoc(Types.DECIMAL));
195         _typeSqlNameMap.put("CHAR", new Integer JavaDoc(Types.CHAR));
196         _typeSqlNameMap.put("VARCHAR", new Integer JavaDoc(Types.VARCHAR));
197         _typeSqlNameMap.put("LONGVARCHAR", new Integer JavaDoc(Types.LONGVARCHAR));
198         _typeSqlNameMap.put("DATE", new Integer JavaDoc(Types.DATE));
199         _typeSqlNameMap.put("TIME", new Integer JavaDoc(Types.TIME));
200         _typeSqlNameMap.put("TIMESTAMP", new Integer JavaDoc(Types.TIMESTAMP));
201         _typeSqlNameMap.put("BINARY", new Integer JavaDoc(Types.BINARY));
202         _typeSqlNameMap.put("VARBINARY", new Integer JavaDoc(Types.VARBINARY));
203         _typeSqlNameMap.put("LONGVARBINARY", new Integer JavaDoc(Types.LONGVARBINARY));
204         _typeSqlNameMap.put("NULL", new Integer JavaDoc(Types.NULL));
205         _typeSqlNameMap.put("OTHER", new Integer JavaDoc(Types.OTHER));
206         _typeSqlNameMap.put("JAVA_OBJECT", new Integer JavaDoc(Types.JAVA_OBJECT));
207         _typeSqlNameMap.put("DISTINCT", new Integer JavaDoc(Types.DISTINCT));
208         _typeSqlNameMap.put("STRUCT", new Integer JavaDoc(Types.STRUCT));
209         _typeSqlNameMap.put("ARRAY", new Integer JavaDoc(Types.ARRAY));
210         _typeSqlNameMap.put("BLOB", new Integer JavaDoc(Types.BLOB));
211         _typeSqlNameMap.put("CLOB", new Integer JavaDoc(Types.CLOB));
212         _typeSqlNameMap.put("REF", new Integer JavaDoc(Types.REF));
213         _typeSqlNameMap.put("DATALINK", new Integer JavaDoc(Types.DATALINK));
214         _typeSqlNameMap.put("BOOLEAN", new Integer JavaDoc(Types.BOOLEAN));
215
216         // some JAVA synonyms
217
_typeSqlNameMap.put("BYTE", new Integer JavaDoc(Types.TINYINT));
218         _typeSqlNameMap.put("SHORT", new Integer JavaDoc(Types.SMALLINT));
219         _typeSqlNameMap.put("INT", new Integer JavaDoc(Types.INTEGER));
220         _typeSqlNameMap.put("LONG", new Integer JavaDoc(Types.BIGINT));
221
222         // cache the Map.get method for efficiency
223
try {
224             _methodMapGet = java.util.Map JavaDoc.class.getMethod("get", new Class JavaDoc[]{Object JavaDoc.class});
225         } catch (NoSuchMethodException JavaDoc e) {
226             throw new ControlException("Can not find java.util.Map.get(Object) method");
227         }
228     }
229
230     /**
231      * Convert a type string to its SQL Type int value.
232      * @param type A String containing the SQL type name.
233      * @return The SQL type, TYPE_UNKNOWN if cannot convert.
234      */

235     public int convertStringToSQLType(String JavaDoc type) {
236         if (_typeSqlNameMap.containsKey(type.toUpperCase())) {
237             return _typeSqlNameMap.get(type.toUpperCase());
238         }
239         return TYPE_UNKNOWN;
240     }
241
242     /**
243      * Get the SQL type of a class, start at top level class an check all super classes until match is found.
244      * @param classType Class to get SQL type of.
245      * @return Types.OTHER if cannot find SQL type.
246      */

247     public int getSqlType(Class JavaDoc classType) {
248
249         final Class JavaDoc origType = classType;
250         while (classType != null) {
251             Integer JavaDoc type = _typeSqlMap.get(classType);
252             if (type != null) {
253                 return type.intValue();
254             }
255             classType = classType.getSuperclass();
256         }
257
258         //
259
// special check for blobs/clobs they are interfaces not derived from
260
//
261
if (Blob JavaDoc.class.isAssignableFrom(origType)) {
262             return _typeSqlMap.get(Blob JavaDoc.class).intValue();
263         } else if (Clob JavaDoc.class.isAssignableFrom(origType)) {
264             return _typeSqlMap.get(Clob JavaDoc.class).intValue();
265         }
266
267         return Types.OTHER;
268     }
269
270     /**
271      * Get the SQL type for an object.
272      * @param o Object to get SQL type of.
273      * @return SQL type of the object, Types.OTHER if cannot classify.
274      */

275     public int getSqlType(Object JavaDoc o) {
276         if (null == o) {
277             return Types.NULL;
278         }
279         return getSqlType(o.getClass());
280     }
281
282     /**
283      *
284      * @param val
285      * @param args
286      * @return
287      * @throws IllegalAccessException
288      * @throws InvocationTargetException
289      */

290     public Object JavaDoc lookupType(Object JavaDoc val, Object JavaDoc[] args)
291             throws IllegalAccessException JavaDoc, InvocationTargetException JavaDoc
292     {
293         return _methodMapGet.invoke(val, args);
294     }
295
296     /**
297      * Get the type id (defined by this class) for the given class.
298      * @param classType Class to get type of.
299      * @return Type id of class.
300      */

301     public int getTypeId(Class JavaDoc classType) {
302
303         final Class JavaDoc origType = classType;
304         while (null != classType) {
305             Integer JavaDoc typeObj = (Integer JavaDoc) _typeMap.get(classType);
306             if (null != typeObj) {
307                 return typeObj.intValue();
308             }
309             classType = classType.getSuperclass();
310         }
311
312         //
313
// special check for blobs/clobs they are interfaces not derived from
314
//
315
if (Blob JavaDoc.class.isAssignableFrom(origType)) {
316             return _typeMap.get(Blob JavaDoc.class).intValue();
317         } else if (Clob JavaDoc.class.isAssignableFrom(origType)) {
318             return _typeMap.get(Clob JavaDoc.class).intValue();
319         }
320
321         return TYPE_UNKNOWN;
322     }
323
324    /**
325     * Returns a primitive legal value as opposed to null if type is primitive.
326     * @param type type to get null value for.
327     * @return null value for specifed type.
328     */

329    public Object JavaDoc fixNull(Class JavaDoc type) {
330        return type.isPrimitive() ? _primitiveDefaults.get(type) : null;
331    }
332
333    /**
334      * Create an Object array for the given array.
335      *
336      * @param o An array.
337      * @return A new object array.
338      */

339     public static Object JavaDoc[] toObjectArray(Object JavaDoc o) {
340
341         Class JavaDoc clas = o.getClass().getComponentType();
342
343         if (null == clas) return null;
344
345         Object JavaDoc[] arr;
346
347         if (clas == Boolean.TYPE) {
348             boolean[] src = (boolean[]) o;
349             arr = new Object JavaDoc[src.length];
350             for (int i = 0; i < src.length; i++)
351                 arr[i] = new Boolean JavaDoc(src[i]);
352         } else if (clas == Character.TYPE) {
353             char[] src = (char[]) o;
354             arr = new Object JavaDoc[src.length];
355             for (int i = 0; i < src.length; i++)
356                 arr[i] = new Character JavaDoc(src[i]);
357         } else if (clas == Byte.TYPE) {
358             byte[] src = (byte[]) o;
359             arr = new Object JavaDoc[src.length];
360             for (int i = 0; i < src.length; i++)
361                 arr[i] = new Byte JavaDoc(src[i]);
362         } else if (clas == Short.TYPE) {
363             short[] src = (short[]) o;
364             arr = new Object JavaDoc[src.length];
365             for (int i = 0; i < src.length; i++)
366                 arr[i] = new Short JavaDoc(src[i]);
367         } else if (clas == Integer.TYPE) {
368             int[] src = (int[]) o;
369             arr = new Object JavaDoc[src.length];
370             for (int i = 0; i < src.length; i++)
371                 arr[i] = new Integer JavaDoc(src[i]);
372         } else if (clas == Long.TYPE) {
373             long[] src = (long[]) o;
374             arr = new Object JavaDoc[src.length];
375             for (int i = 0; i < src.length; i++)
376                 arr[i] = new Long JavaDoc(src[i]);
377         } else if (clas == Float.TYPE) {
378             float[] src = (float[]) o;
379             arr = new Object JavaDoc[src.length];
380             for (int i = 0; i < src.length; i++)
381                 arr[i] = new Float JavaDoc(src[i]);
382         } else if (clas == Double.TYPE) {
383             double[] src = (double[]) o;
384             arr = new Object JavaDoc[src.length];
385             for (int i = 0; i < src.length; i++)
386                 arr[i] = new Double JavaDoc(src[i]);
387         } else {
388             arr = (Object JavaDoc[]) o;
389         }
390         return arr;
391     }
392 }
393
Popular Tags