/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.transformation.reverseeng.api; import static java.sql.Types.BIGINT; import static java.sql.Types.BINARY; import static java.sql.Types.BIT; import static java.sql.Types.DATE; import static java.sql.Types.DECIMAL; import static java.sql.Types.DOUBLE; import static java.sql.Types.FLOAT; import static java.sql.Types.INTEGER; import static java.sql.Types.SMALLINT; import static java.sql.Types.TIME; import static java.sql.Types.TIMESTAMP; import static java.sql.Types.VARCHAR; import java.lang.reflect.Array; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.teiid.designer.annotation.AnnotationUtils; import org.teiid.designer.annotation.Since; import org.teiid.designer.runtime.version.spi.ITeiidServerVersion; import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version; import org.teiid.designer.type.IDataTypeManagerService.DataTypeAliases; import org.teiid.designer.type.IDataTypeManagerService.DataTypeName; public class RuntimeTypesConstants { /** * Keys: SQL int type definitions from java.sql.Types, Values: java class names */ private static final Map<String, String> SQL_TO_JAVA_MAP = new HashMap<String, String>(); private static final Map<String, DefaultDataTypes> SQL_TO_DTYPE_MAP = new HashMap<String, DefaultDataTypes>(); /** * The names of the primitive built-in datatypes (19 entries). A primitive built-in type * is one in which its basetype is the UR-type of "anySimpleType" * string, time, date, char, biginteger, bigdecimal, float, double, integer, timestamp, object, clob, blob, geometry, varbinary * PrimitiveBuiltInNames */ public static final String STRING = "string"; //$NON-NLS-1$ public static final String BOOLEAN = "boolean";//$NON-NLS-1$ public static final String FLOAT = "float";//$NON-NLS-1$ public static final String DOUBLE = "double";//$NON-NLS-1$ public static final String DATE = "date";//$NON-NLS-1$ public static final String TIME = "time";//$NON-NLS-1$ public static final String CHAR = "char";//$NON-NLS-1$ public static final String BIGDECIMAL = "bigdecimal";//$NON-NLS-1$ public static final String INTEGER = "integer";//$NON-NLS-1$ public static final String TIMESTAMP = "timestamp";//$NON-NLS-1$ public static final String OBJECT = "object";//$NON-NLS-1$ public static final String CLOB = "clob";//$NON-NLS-1$ public static final String BLOB = "blob";//$NON-NLS-1$ public static final String GEOMETRY = "geometry";//$NON-NLS-1$ public static final String VARBINARY = "varbinary";//$NON-NLS-1$ public static final String BYTE = "byte"; //$NON-NLS-1$ public static final String LONG = "long"; //$NON-NLS-1$ /** * JavaTypeClassNames */ // char constants for Java data types // public static final String JAVA_LONG = "java.lang.Long"; // public static final String JAVA_BYTES = "byte[]"; // public static final String JAVA_BOOLEAN = "java.lang.Boolean"; // public static final String JAVA_STRING = "java.lang.String"; // public static final String JAVA_SQLDATE = "java.sql.Date"; // public static final String JAVA_UTILDATE = "java.util.Date"; // public static final String JAVA_BIGDECIMAL = "java.math.BigDecimal"; // public static final String JAVA_DOUBLE = "java.lang.Double"; // public static final String JAVA_FLOAT = "java.lang.Float"; // public static final String JAVA_INTEGER = "java.lang.Integer"; // public static final String JAVA_SHORT = "java.lang.Short"; // public static final String JAVA_BYTE = "java.lang.Byte"; // public static final String JAVA_TIME = "java.sql.Time"; // public static final String JAVA_TIMESTAMP = "java.sql.Timestamp"; // public static final String JAVA_BLOB = "java.sql.Blob"; // public static final String JAVA_OBJECT = "java.lang.Object"; // public static final String JAVA_CHARACTER = "java.lang.Character"; // static { // SQL_TO_JAVA_MAP.put(STRING, JAVA_STRING); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_BOOLEAN); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_BOOLEAN); // SQL_TO_JAVA_MAP.put(FLOAT, JAVA_FLOAT); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_BIGDECIMAL); // SQL_TO_JAVA_MAP.put(BLOB, JAVA_BLOB); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_BYTE); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_BYTES); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_DOUBLE); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_INTEGER); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_LONG); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_OBJECT); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_SHORT); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_SQLDATE); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_TIME); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_TIMESTAMP); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_UTILDATE); // SQL_TO_JAVA_MAP.put(BOOLEAN, JAVA_UTILDATE); // } static { SQL_TO_DTYPE_MAP.put(STRING, DefaultDataTypes.STRING); SQL_TO_DTYPE_MAP.put(BOOLEAN, DefaultDataTypes.BOOLEAN); SQL_TO_DTYPE_MAP.put(BYTE, DefaultDataTypes.BYTE); SQL_TO_DTYPE_MAP.put(FLOAT, DefaultDataTypes.FLOAT); SQL_TO_DTYPE_MAP.put(CHAR, DefaultDataTypes.CHAR); SQL_TO_DTYPE_MAP.put(INTEGER, DefaultDataTypes.INTEGER); SQL_TO_DTYPE_MAP.put(DOUBLE, DefaultDataTypes.DOUBLE); SQL_TO_DTYPE_MAP.put(BIGDECIMAL, DefaultDataTypes.BIG_DECIMAL); SQL_TO_DTYPE_MAP.put(DATE, DefaultDataTypes.DATE); SQL_TO_DTYPE_MAP.put(TIME, DefaultDataTypes.TIME); SQL_TO_DTYPE_MAP.put(TIMESTAMP, DefaultDataTypes.TIMESTAMP); SQL_TO_DTYPE_MAP.put(OBJECT, DefaultDataTypes.OBJECT); SQL_TO_DTYPE_MAP.put(GEOMETRY, DefaultDataTypes.OBJECT); SQL_TO_DTYPE_MAP.put(CLOB, DefaultDataTypes.STRING); SQL_TO_DTYPE_MAP.put(BLOB, DefaultDataTypes.OBJECT); SQL_TO_DTYPE_MAP.put(LONG, DefaultDataTypes.LONG); } public enum DefaultDataTypes { STRING ("string", DataTypeName.STRING, String.class, 256, DataTypeAliases.VARCHAR), //$NON-NLS-1$ BOOLEAN ("boolean", DataTypeName.BOOLEAN, Boolean.class), //$NON-NLS-1$ BYTE ("byte", DataTypeName.BYTE, Byte.class, 3, "0123456789-", DataTypeAliases.TINYINT), //$NON-NLS-1$ //$NON-NLS-2$ SHORT ("short", DataTypeName.SHORT, Short.class, 5, "0123456789-", DataTypeAliases.SMALLINT), //$NON-NLS-1$ //$NON-NLS-2$ CHAR ("char", DataTypeName.CHAR, Character.class, 1), //$NON-NLS-1$ INTEGER ("integer", DataTypeName.INTEGER, Integer.class, 10, "0123456789-"), //$NON-NLS-1$ //$NON-NLS-2$ LONG ("long", DataTypeName.LONG, Long.class, 19, "0123456789-", DataTypeAliases.BIGINT), //$NON-NLS-1$ //$NON-NLS-2$ BIG_INTEGER ("biginteger", DataTypeName.BIGINTEGER, BigInteger.class, 30, "0123456789-"), //$NON-NLS-1$ //$NON-NLS-2$ FLOAT ("float", DataTypeName.FLOAT, Float.class, 30, "0123456789-+.eE", DataTypeAliases.REAL), //$NON-NLS-1$ //$NON-NLS-2$ DOUBLE ("double", DataTypeName.DOUBLE, Double.class, 30, "0123456789-+.eE"), //$NON-NLS-1$ //$NON-NLS-2$ BIG_DECIMAL ("bigdecimal", DataTypeName.BIGDECIMAL, BigDecimal.class, 30, "0123456789-.eE", DataTypeAliases.DECIMAL), //$NON-NLS-1$ //$NON-NLS-2$ DATE ("date", DataTypeName.DATE, Date.class), //$NON-NLS-1$ TIME ("time", DataTypeName.TIME, Time.class), //$NON-NLS-1$ TIMESTAMP ("timestamp", DataTypeName.TIMESTAMP, Timestamp.class), //$NON-NLS-1$ OBJECT ("object", DataTypeName.OBJECT, Object.class); //$NON-NLS-1$ // NULL ("null", DataTypeName.NULL, NullType.class), //$NON-NLS-1$ // // BLOB ("blob", DataTypeName.BLOB, BlobType.class), //$NON-NLS-1$ // // CLOB ("clob", DataTypeName.CLOB, ClobType.class), //$NON-NLS-1$ // // XML ("xml", DataTypeName.XML, XMLType.class), //$NON-NLS-1$ // // @Since(Version.TEIID_8_0) // VARBINARY ("varbinary", DataTypeName.VARBINARY, BinaryType.class), //$NON-NLS-1$ // // @Since(Version.TEIID_8_10) // GEOMETRY ("geometry", DataTypeName.GEOMETRY, GeometryType.class); //$NON-NLS-1$ private static Map<ITeiidServerVersion, List<DefaultDataTypes>> valueCache = new HashMap<ITeiidServerVersion, List<DefaultDataTypes>>(); private String id; private DataTypeName dataTypeName; private Class<?> klazz; private int limit = -1; private String validChars = null; private Class<?> arrayKlazz; private Set<DataTypeAliases> aliases = Collections.emptySet(); DefaultDataTypes(String id, DataTypeName dataTypeName, Class<?> klazz, DataTypeAliases... aliases) { this.id = id; this.dataTypeName = dataTypeName; this.klazz = klazz; if (aliases != null) { this.aliases = new HashSet<DataTypeAliases>(); for (DataTypeAliases alias : aliases) { this.aliases.add(alias); } } this.arrayKlazz = Array.newInstance(klazz, 0).getClass(); } DefaultDataTypes(String id, DataTypeName dataTypeName, Class<?> klazz, int limit, DataTypeAliases... aliases) { this(id, dataTypeName, klazz, aliases); this.limit = limit; } DefaultDataTypes(String id, DataTypeName dataTypeName, Class<?> klazz, int limit, String validChars, DataTypeAliases... aliases) { this(id, dataTypeName, klazz, limit, aliases); this.validChars = validChars; } public String getId() { return this.id; } public DataTypeName getDataTypeName() { return dataTypeName; } public Class<?> getTypeClass() { return klazz; } public Class<?> getTypeArrayClass() { return arrayKlazz; } public int getLimit() { return this.limit; } public String getValidChars() { return validChars; } /** * @param alias * @return true if this type contains the given alias, false otherwise */ public boolean hasAlias(DataTypeAliases alias) { return aliases.contains(alias); } /** * @param alias * @return true if this type contains the given alias, false otherwise */ public boolean hasAlias(String aliasId) { for (DataTypeAliases alias : aliases) { if(alias.getId().equalsIgnoreCase(aliasId)) return true; } return false; } // /** // * Is the supplied class type a LOB based data type? // * // * @param type // * @return true if yes; false otherwise // */ // public static boolean isLOB(Class<?> type) { // return BLOB.getTypeClass().equals(type) // || CLOB.getTypeClass().equals(type) // || XML.getTypeClass().equals(type) // || GEOMETRY.getTypeClass().equals(type); // } /** * Use instead of values() since it will only return the enumerated values * that conform to the given teiid version. * * This is going to be used an awful lot so reduce the need to call on * {@link AnnotationUtils} which contains reflection code which is slow * by caching the results. * * @param teiidVersion * * @return set of values for teiid version */ public static List<DefaultDataTypes> getValues(ITeiidServerVersion teiidVersion) { List<DefaultDataTypes> appDataTypes = valueCache.get(teiidVersion); if (appDataTypes == null) { appDataTypes = new ArrayList<DefaultDataTypes>(); for (DefaultDataTypes dataType : DefaultDataTypes.values()) { if (! AnnotationUtils.isApplicable(dataType, teiidVersion)) continue; appDataTypes.add(dataType); } valueCache.put(teiidVersion, appDataTypes); } return appDataTypes; } /** * Return enum value for code but only if available for given teiid version * * @param teiidVersion * @param ordinal * @return enum value for ordinal */ public static DefaultDataTypes valueOf(ITeiidServerVersion teiidVersion, int ordinal) { for (DefaultDataTypes dataType : DefaultDataTypes.values()) { if (! AnnotationUtils.isApplicable(dataType, teiidVersion)) continue; if (dataType.ordinal() == ordinal) return dataType; } return null; } } public static String getJavaType(String runtimeTypeName) { String typeString = SQL_TO_DTYPE_MAP.get(runtimeTypeName).getTypeClass().toString(); if( typeString.startsWith("class ") ) { typeString = typeString.substring(6); } return typeString; } }