1 19 package org.netbeans.modules.j2ee.persistence.entitygenerator; 20 21 import java.lang.ref.SoftReference ; 22 import java.math.BigDecimal ; 23 import java.math.BigInteger ; 24 import java.sql.Types ; 25 import java.util.*; 26 import org.netbeans.modules.dbschema.ColumnElement; 27 28 33 class SQLType { 34 private int sqlType; 35 private String stringValue; 36 private Class [] typeList; 37 private boolean supportsFinder; 38 private static final SQLType UNKNOWN = new SQLType(Types.OTHER, 39 "UNKNOWN", new Class [0], false); 41 42 private SQLType(int type, String value, Class [] tList, boolean supportsFinder) { 43 sqlType = type; 44 stringValue = value; 45 typeList = tList; 46 this.supportsFinder = supportsFinder; 47 } 48 49 52 public boolean equals(Object other) { 53 if (other == null || !getClass().isInstance(other)){ 54 return false; 55 } 56 return ((SQLType)other).sqlType == sqlType; 57 } 58 59 62 public int hashCode() { 63 return sqlType; 64 } 65 66 70 public String toString() { 71 return stringValue; 72 } 73 74 78 public int sqlType() { 79 return sqlType; 80 } 81 82 87 private List getValidClasses() { 88 List retList = new ArrayList(typeList.length); 89 retList.addAll(Arrays.asList(typeList)); 90 return retList; 91 } 92 93 97 String getMemberType(ColumnElement element) { 98 String memberType = java.io.Serializable .class.getName(); 99 Class memberTypeClass = null; 100 101 if (element.isCharacterType()) { 102 memberTypeClass = getClassForCharType(element.getLength(), 103 element.isNullable()); 104 } else if (element.isNumericType()) { 105 memberTypeClass = getClassForNumericType(element.getPrecision(), 106 element.getScale(), element.isNullable()); 107 } 108 109 if (memberTypeClass != null) { 110 return memberTypeClass.getName(); 111 } 112 113 if (typeList.length > 0) { 114 memberType = typeList[0].getName(); 115 } 116 117 118 if (memberType.equals("[B")) { 119 memberType = "byte []"; 120 } 121 return memberType; 122 } 123 124 private Class getClassForCharType (Integer length, boolean isNullable) { 128 switch (sqlType) { 129 case Types.CHAR: 130 if ((length != null) && (length.intValue() == 1)) { 131 return typeList[isNullable ? 1 : 2]; 132 } 133 default: 134 return null; 135 } 136 } 137 138 private Class getClassForNumericType(Integer precision, 142 Integer scale, boolean isNullable) { 143 int precValue = ((precision == null) ? -1 : precision.intValue()); 144 int scaleValue = ((scale == null) ? -1 : scale.intValue()); 145 146 switch (sqlType) { 147 case Types.DECIMAL: 148 case Types.NUMERIC: 149 if ((precValue <= 0) && (scaleValue <= 0)){ 153 return BigInteger .class; 154 } 155 156 if (scaleValue > 0) { 157 return BigDecimal .class; 158 } 159 if (precValue > 18) { 160 return BigInteger .class; 161 } 162 if (precValue > 9) { 163 return (isNullable ? Long .class : Long.TYPE); 164 } 165 if (precValue > 4) { 166 return (isNullable ? Integer .class : Integer.TYPE); 167 } 168 return (isNullable ? Short .class : Short.TYPE); 169 case Types.FLOAT: 170 case Types.DOUBLE: 171 case Types.REAL: 172 case Types.BIGINT: 173 case Types.INTEGER: 174 case Types.SMALLINT: 175 case Types.TINYINT: 176 case Types.BIT: 177 return typeList[isNullable ? 0 : 1]; 178 default: 179 return null; 180 } 181 } 182 183 187 public List getValidObjects() { 188 List classList = getValidClasses(); 189 Iterator it = classList.iterator(); 190 while (it.hasNext()) { 191 if (((Class ) it.next()).isPrimitive()) { 192 it.remove(); 193 } 194 } 195 return classList; 196 } 197 198 public boolean supportsFinder() { 199 return supportsFinder; 200 } 201 202 207 public static SQLType getSQLType(int sqlType) { 208 List types = getSQLTypes(); 209 int ind = types.indexOf(new SQLType(sqlType, null, null, false)); 210 return ind==-1?UNKNOWN:(SQLType)types.get(ind); 211 } 212 213 private static List getSQLTypes() { 214 List types = (List) typeCache.get(); 215 if (types == null) { 216 types = getAllSQLTypes(); 217 typeCache = new SoftReference (types); 218 } 219 return types; 220 } 221 222 private static List getAllSQLTypes() { 223 return Arrays.asList(new SQLType[] { 224 new SQLType(Types.ARRAY, "ARRAY", new Class [0], false), 226 new SQLType(Types.BIGINT, "BIGINT", new Class [] {java.math.BigInteger .class, Long.TYPE}, true), 228 new SQLType(Types.DECIMAL, "DECIMAL", new Class [] {java.math.BigDecimal .class, java.math.BigInteger .class, 230 Short .class, Short.TYPE, Integer .class, Integer.TYPE, 231 Long .class, Long.TYPE}, true), 232 new SQLType(Types.NUMERIC, "NUMERIC", new Class [] {java.math.BigDecimal .class, java.math.BigInteger .class, 234 Short .class, Short.TYPE, Integer .class, Integer.TYPE, 235 Long .class, Long.TYPE}, true), 236 new SQLType(Types.BLOB, "BLOB", new Class [0], false), 238 new SQLType(Types.CHAR, "CHAR", new Class [] {java.lang.String .class, Character .class, Character.TYPE}, true), 240 new SQLType(Types.LONGVARCHAR, "LONGVARCHAR", new Class [] {java.lang.String .class}, true), 242 new SQLType(Types.VARCHAR, "VARCHAR", new Class [] {java.lang.String .class}, true), 244 new SQLType(Types.CLOB, "CLOB", new Class [] {java.lang.String .class}, false), 246 new SQLType(Types.DATE, "DATE", new Class [] {java.sql.Date .class}, false), 248 new SQLType(Types.FLOAT, "FLOAT", new Class [] {Double .class, Double.TYPE}, true), 250 new SQLType(Types.DOUBLE, "DOUBLE", new Class [] {Double .class, Double.TYPE}, true), 252 new SQLType(Types.REAL, "REAL", new Class [] {Float .class, Float.TYPE}, true), 254 new SQLType(Types.INTEGER, "INTEGER", new Class [] {Integer .class, Integer.TYPE}, true), 256 new SQLType(Types.JAVA_OBJECT, "JAVA_OBJECT", new Class [0], false), 258 new SQLType(Types.NULL, "NULL", new Class [0], false), 260 new SQLType(Types.OTHER, "OTHER", new Class []{Object .class}, true), 262 new SQLType(Types.STRUCT, "STRUCT", new Class [0], false), 264 new SQLType(Types.DISTINCT, "DISTINCT", new Class [0], false), 266 new SQLType(Types.BINARY, "BINARY", new Class [] { byte[].class}, false), 268 new SQLType(Types.BIT, "BIT", new Class [] {Boolean .class, Boolean.TYPE}, true), 270 new SQLType(Types.VARBINARY, "VARBINARY", new Class [] {byte[].class}, false), 272 new SQLType(Types.LONGVARBINARY, "LONGVARBINARY", new Class [] {byte[].class}, false), 274 new SQLType(Types.REF, "REF", new Class [0], false), 276 new SQLType(Types.SMALLINT, "SMALLINT", new Class [] {Short .class, Short.TYPE}, true), 278 new SQLType(Types.TINYINT, "TINYINT", new Class [] {Short .class, Short.TYPE}, true), 280 new SQLType(Types.TIME, "TIME", new Class [] {java.sql.Time .class}, false), 282 new SQLType(Types.TIMESTAMP, "TIMESTAMP", new Class [] {java.sql.Timestamp .class}, false) 284 }); 285 } 286 287 private static SoftReference typeCache = new SoftReference (null); 288 } 289 290 | Popular Tags |