1 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 ; 24 import java.lang.reflect.InvocationTargetException ; 25 import java.sql.Types ; 26 import java.sql.Blob ; 27 import java.sql.Clob ; 28 import java.util.HashMap ; 29 import java.util.Map ; 30 31 34 public final class TypeMappingsFactory { 36 37 38 private static TypeMappingsFactory _instance; 39 40 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 <Class , Object > _primitiveDefaults; 85 86 private Map <Class , Integer > _typeMap; 92 private Map <Class , Integer > _typeSqlMap; 93 94 98 private Map <String , Integer > _typeSqlNameMap; 99 100 private static Method _methodMapGet; 101 102 105 TypeMappingsFactory() { 106 107 _primitiveDefaults = new HashMap <Class , Object >(); 108 _primitiveDefaults.put(Boolean.TYPE, Boolean.FALSE); 109 _primitiveDefaults.put(Integer.TYPE, new Integer (0)); 110 _primitiveDefaults.put(Long.TYPE, new Long (0)); 111 _primitiveDefaults.put(Byte.TYPE, new Byte ((byte) 0)); 112 _primitiveDefaults.put(Short.TYPE, new Short ((short) 0)); 113 _primitiveDefaults.put(Character.TYPE, new Character ('\u0000')); 114 _primitiveDefaults.put(Float.TYPE, new Float (0.0f)); 115 _primitiveDefaults.put(Double.TYPE, new Double (0.0d)); 116 117 _typeMap = new HashMap <Class , Integer >(TYPE_MAX * 2); 119 _typeMap.put(Boolean.TYPE, new Integer (TYPE_BOOLEAN)); 120 _typeMap.put(Integer.TYPE, new Integer (TYPE_INT)); 121 _typeMap.put(Long.TYPE, new Integer (TYPE_LONG)); 122 _typeMap.put(Byte.TYPE, new Integer (TYPE_BYTE)); 123 _typeMap.put(Short.TYPE, new Integer (TYPE_SHORT)); 124 _typeMap.put(Float.TYPE, new Integer (TYPE_FLOAT)); 125 _typeMap.put(Double.TYPE, new Integer (TYPE_DOUBLE)); 126 _typeMap.put(Boolean .class, new Integer (TYPE_BOOLEAN_OBJ)); 127 _typeMap.put(Integer .class, new Integer (TYPE_INT_OBJ)); 128 _typeMap.put(Long .class, new Integer (TYPE_LONG_OBJ)); 129 _typeMap.put(Byte .class, new Integer (TYPE_BYTE_OBJ)); 130 _typeMap.put(Short .class, new Integer (TYPE_SHORT_OBJ)); 131 _typeMap.put(Float .class, new Integer (TYPE_FLOAT_OBJ)); 132 _typeMap.put(Double .class, new Integer (TYPE_DOUBLE_OBJ)); 133 _typeMap.put(String .class, new Integer (TYPE_STRING)); 134 _typeMap.put(java.math.BigDecimal .class, new Integer (TYPE_BIG_DECIMAL)); 135 _typeMap.put(byte[].class, new Integer (TYPE_BYTES)); 136 _typeMap.put(java.sql.Timestamp .class, new Integer (TYPE_TIMESTAMP)); 137 _typeMap.put(java.sql.Time .class, new Integer (TYPE_TIME)); 138 _typeMap.put(java.sql.Date .class, new Integer (TYPE_SQLDATE)); 139 _typeMap.put(java.sql.Ref .class, new Integer (TYPE_REF)); 140 _typeMap.put(java.sql.Blob .class, new Integer (TYPE_BLOB)); 141 _typeMap.put(java.sql.Clob .class, new Integer (TYPE_CLOB)); 142 _typeMap.put(java.sql.Array .class, new Integer (TYPE_ARRAY)); 143 _typeMap.put(java.sql.Struct .class, new Integer (TYPE_STRUCT)); 144 _typeMap.put(java.io.Reader .class, new Integer (TYPE_READER)); 145 _typeMap.put(java.io.InputStream .class, new Integer (TYPE_STREAM)); 146 _typeMap.put(java.util.Date .class, new Integer (TYPE_DATE)); 147 _typeMap.put(java.util.Calendar .class, new Integer (TYPE_CALENDAR)); 148 _typeMap.put(java.util.GregorianCalendar .class, new Integer (TYPE_CALENDAR)); 149 _typeMap.put(org.apache.xmlbeans.StringEnumAbstractBase.class, new Integer (TYPE_XMLBEAN_ENUM)); 150 151 _typeSqlMap = new HashMap <Class , Integer >(TYPE_MAX * 2); 153 _typeSqlMap.put(Boolean.TYPE, new Integer (Types.BOOLEAN)); 154 _typeSqlMap.put(Integer.TYPE, new Integer (Types.INTEGER)); 155 _typeSqlMap.put(Long.TYPE, new Integer (Types.BIGINT)); 156 _typeSqlMap.put(Byte.TYPE, new Integer (Types.TINYINT)); 157 _typeSqlMap.put(Short.TYPE, new Integer (Types.SMALLINT)); 158 _typeSqlMap.put(Float.TYPE, new Integer (Types.REAL)); 159 _typeSqlMap.put(Double.TYPE, new Integer (Types.DOUBLE)); 160 _typeSqlMap.put(Boolean .class, new Integer (Types.BOOLEAN)); 161 _typeSqlMap.put(Integer .class, new Integer (Types.INTEGER)); 162 _typeSqlMap.put(Long .class, new Integer (Types.BIGINT)); 163 _typeSqlMap.put(Byte .class, new Integer (Types.TINYINT)); 164 _typeSqlMap.put(Short .class, new Integer (Types.SMALLINT)); 165 _typeSqlMap.put(Float .class, new Integer (Types.REAL)); 166 _typeSqlMap.put(Double .class, new Integer (Types.DOUBLE)); 167 _typeSqlMap.put(String .class, new Integer (Types.VARCHAR)); 168 _typeSqlMap.put(java.math.BigDecimal .class, new Integer (Types.DECIMAL)); 169 _typeSqlMap.put(byte[].class, new Integer (Types.VARBINARY)); 170 _typeSqlMap.put(java.sql.Timestamp .class, new Integer (Types.TIMESTAMP)); 171 _typeSqlMap.put(java.sql.Time .class, new Integer (Types.TIME)); 172 _typeSqlMap.put(java.sql.Date .class, new Integer (Types.DATE)); 173 _typeSqlMap.put(java.sql.Ref .class, new Integer (Types.REF)); 174 _typeSqlMap.put(java.sql.Blob .class, new Integer (Types.BLOB)); 175 _typeSqlMap.put(java.sql.Clob .class, new Integer (Types.CLOB)); 176 _typeSqlMap.put(java.sql.Array .class, new Integer (Types.ARRAY)); 177 _typeSqlMap.put(java.sql.Struct .class, new Integer (Types.STRUCT)); 178 _typeSqlMap.put(java.util.Date .class, new Integer (Types.TIMESTAMP)); 179 _typeSqlMap.put(java.util.Calendar .class, new Integer (Types.TIMESTAMP)); 180 _typeSqlMap.put(java.util.GregorianCalendar .class, new Integer (Types.TIMESTAMP)); 181 _typeSqlMap.put(org.apache.xmlbeans.StringEnumAbstractBase.class, new Integer (Types.VARCHAR)); 182 183 _typeSqlNameMap = new HashMap <String , Integer >(TYPE_MAX * 2); 185 _typeSqlNameMap.put("BIT", new Integer (Types.BIT)); 186 _typeSqlNameMap.put("TINYINT", new Integer (Types.TINYINT)); 187 _typeSqlNameMap.put("SMALLINT", new Integer (Types.SMALLINT)); 188 _typeSqlNameMap.put("INTEGER", new Integer (Types.INTEGER)); 189 _typeSqlNameMap.put("BIGINT", new Integer (Types.BIGINT)); 190 _typeSqlNameMap.put("FLOAT", new Integer (Types.REAL)); 191 _typeSqlNameMap.put("REAL", new Integer (Types.REAL)); 192 _typeSqlNameMap.put("DOUBLE", new Integer (Types.DOUBLE)); 193 _typeSqlNameMap.put("NUMERIC", new Integer (Types.NUMERIC)); 194 _typeSqlNameMap.put("DECIMAL", new Integer (Types.DECIMAL)); 195 _typeSqlNameMap.put("CHAR", new Integer (Types.CHAR)); 196 _typeSqlNameMap.put("VARCHAR", new Integer (Types.VARCHAR)); 197 _typeSqlNameMap.put("LONGVARCHAR", new Integer (Types.LONGVARCHAR)); 198 _typeSqlNameMap.put("DATE", new Integer (Types.DATE)); 199 _typeSqlNameMap.put("TIME", new Integer (Types.TIME)); 200 _typeSqlNameMap.put("TIMESTAMP", new Integer (Types.TIMESTAMP)); 201 _typeSqlNameMap.put("BINARY", new Integer (Types.BINARY)); 202 _typeSqlNameMap.put("VARBINARY", new Integer (Types.VARBINARY)); 203 _typeSqlNameMap.put("LONGVARBINARY", new Integer (Types.LONGVARBINARY)); 204 _typeSqlNameMap.put("NULL", new Integer (Types.NULL)); 205 _typeSqlNameMap.put("OTHER", new Integer (Types.OTHER)); 206 _typeSqlNameMap.put("JAVA_OBJECT", new Integer (Types.JAVA_OBJECT)); 207 _typeSqlNameMap.put("DISTINCT", new Integer (Types.DISTINCT)); 208 _typeSqlNameMap.put("STRUCT", new Integer (Types.STRUCT)); 209 _typeSqlNameMap.put("ARRAY", new Integer (Types.ARRAY)); 210 _typeSqlNameMap.put("BLOB", new Integer (Types.BLOB)); 211 _typeSqlNameMap.put("CLOB", new Integer (Types.CLOB)); 212 _typeSqlNameMap.put("REF", new Integer (Types.REF)); 213 _typeSqlNameMap.put("DATALINK", new Integer (Types.DATALINK)); 214 _typeSqlNameMap.put("BOOLEAN", new Integer (Types.BOOLEAN)); 215 216 _typeSqlNameMap.put("BYTE", new Integer (Types.TINYINT)); 218 _typeSqlNameMap.put("SHORT", new Integer (Types.SMALLINT)); 219 _typeSqlNameMap.put("INT", new Integer (Types.INTEGER)); 220 _typeSqlNameMap.put("LONG", new Integer (Types.BIGINT)); 221 222 try { 224 _methodMapGet = java.util.Map .class.getMethod("get", new Class []{Object .class}); 225 } catch (NoSuchMethodException e) { 226 throw new ControlException("Can not find java.util.Map.get(Object) method"); 227 } 228 } 229 230 235 public int convertStringToSQLType(String type) { 236 if (_typeSqlNameMap.containsKey(type.toUpperCase())) { 237 return _typeSqlNameMap.get(type.toUpperCase()); 238 } 239 return TYPE_UNKNOWN; 240 } 241 242 247 public int getSqlType(Class classType) { 248 249 final Class origType = classType; 250 while (classType != null) { 251 Integer type = _typeSqlMap.get(classType); 252 if (type != null) { 253 return type.intValue(); 254 } 255 classType = classType.getSuperclass(); 256 } 257 258 if (Blob .class.isAssignableFrom(origType)) { 262 return _typeSqlMap.get(Blob .class).intValue(); 263 } else if (Clob .class.isAssignableFrom(origType)) { 264 return _typeSqlMap.get(Clob .class).intValue(); 265 } 266 267 return Types.OTHER; 268 } 269 270 275 public int getSqlType(Object o) { 276 if (null == o) { 277 return Types.NULL; 278 } 279 return getSqlType(o.getClass()); 280 } 281 282 290 public Object lookupType(Object val, Object [] args) 291 throws IllegalAccessException , InvocationTargetException  292 { 293 return _methodMapGet.invoke(val, args); 294 } 295 296 301 public int getTypeId(Class classType) { 302 303 final Class origType = classType; 304 while (null != classType) { 305 Integer typeObj = (Integer ) _typeMap.get(classType); 306 if (null != typeObj) { 307 return typeObj.intValue(); 308 } 309 classType = classType.getSuperclass(); 310 } 311 312 if (Blob .class.isAssignableFrom(origType)) { 316 return _typeMap.get(Blob .class).intValue(); 317 } else if (Clob .class.isAssignableFrom(origType)) { 318 return _typeMap.get(Clob .class).intValue(); 319 } 320 321 return TYPE_UNKNOWN; 322 } 323 324 329 public Object fixNull(Class type) { 330 return type.isPrimitive() ? _primitiveDefaults.get(type) : null; 331 } 332 333 339 public static Object [] toObjectArray(Object o) { 340 341 Class clas = o.getClass().getComponentType(); 342 343 if (null == clas) return null; 344 345 Object [] arr; 346 347 if (clas == Boolean.TYPE) { 348 boolean[] src = (boolean[]) o; 349 arr = new Object [src.length]; 350 for (int i = 0; i < src.length; i++) 351 arr[i] = new Boolean (src[i]); 352 } else if (clas == Character.TYPE) { 353 char[] src = (char[]) o; 354 arr = new Object [src.length]; 355 for (int i = 0; i < src.length; i++) 356 arr[i] = new Character (src[i]); 357 } else if (clas == Byte.TYPE) { 358 byte[] src = (byte[]) o; 359 arr = new Object [src.length]; 360 for (int i = 0; i < src.length; i++) 361 arr[i] = new Byte (src[i]); 362 } else if (clas == Short.TYPE) { 363 short[] src = (short[]) o; 364 arr = new Object [src.length]; 365 for (int i = 0; i < src.length; i++) 366 arr[i] = new Short (src[i]); 367 } else if (clas == Integer.TYPE) { 368 int[] src = (int[]) o; 369 arr = new Object [src.length]; 370 for (int i = 0; i < src.length; i++) 371 arr[i] = new Integer (src[i]); 372 } else if (clas == Long.TYPE) { 373 long[] src = (long[]) o; 374 arr = new Object [src.length]; 375 for (int i = 0; i < src.length; i++) 376 arr[i] = new Long (src[i]); 377 } else if (clas == Float.TYPE) { 378 float[] src = (float[]) o; 379 arr = new Object [src.length]; 380 for (int i = 0; i < src.length; i++) 381 arr[i] = new Float (src[i]); 382 } else if (clas == Double.TYPE) { 383 double[] src = (double[]) o; 384 arr = new Object [src.length]; 385 for (int i = 0; i < src.length; i++) 386 arr[i] = new Double (src[i]); 387 } else { 388 arr = (Object []) o; 389 } 390 return arr; 391 } 392 } 393 | Popular Tags |