package net.sf.minuteProject.utils;
import net.sf.minuteProject.configuration.bean.enumeration.DATABASEenum;
import net.sf.minuteProject.configuration.bean.model.data.Column;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import net.sf.minuteProject.db.type.FieldType;
/**
* Database types / Java types conversions
*
* http://docs.oracle.com/javase/6/docs/api/java/sql/package-summary.html
* http://docs.oracle.com/javase/7/docs/api/java/sql/package-summary.html
*
* http://mindprod.com/jgloss/jdbc.html#DATATYPES
* http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/types.html
* http://cayenne.apache.org/doc/api/org/apache/cayenne/access/types/package-summary.html
* http://db.apache.org/ojb/docu/guides/jdbc-types.html
*/
public class ConvertUtils {
public static final String DB_TYPE_ORACLE = "ORACLE";
public static final String JAVA_BOOLEAN_TYPE = "java.lang.Boolean";
public static final String JAVA_LONG_TYPE = "java.lang.Long";
public static final String JAVA_DOUBLE_TYPE = "java.lang.Double";
public static final String JAVA_INTEGER_TYPE = "java.lang.Integer";
public static final String JAVA_SHORT_TYPE = "java.lang.Short";
public static final String JAVA_TIMESTAMP_TYPE = "java.sql.Timestamp";
public static final String JAVA_SQL_TIMESTAMP_TYPE = "java.sql.Timestamp";
public static final String JAVA_TIME_TYPE = "java.sql.Time";
public static final String JAVA_SQL_TIME_TYPE = "java.sql.Time";
public static final String JAVA_BIGDECIMAL_TYPE = "java.math.BigDecimal";
public static final String JAVA_BIGINTEGER_TYPE = "java.math.BigInteger";
public static final String JAVA_STRING_TYPE = "java.lang.String";
public static final String JAVA_DATE_TYPE = "java.sql.Date";
public static final String JAVA_SQL_DATE_TYPE = "java.sql.Date";
public static final String JAVA_BLOB_TYPE = "java.sql.Blob";
public static final String JAVA_CLOB_TYPE = "java.sql.Clob";
public static final String DB_STRING_CHAR_TYPE = "CHAR";
public static final String DB_STRING2_CHAR_TYPE = "CHAR2";
public static final String DB_STRING_TYPE = "VARCHAR";
public static final String DB_STRING2_TYPE = "VARCHAR2";
public static final String DB_INTEGER_TYPE = "INTEGER";
public static final String DB_INT_TYPE = "INT";
public static final String DB_DECIMAL_TYPE = "DECIMAL";
public static final String DB_DOUBLE_TYPE = "DOUBLE";
public static final String DB_TIMESTAMP_TYPE = "TIMESTAMP";
public static final String DB_TIME_TYPE = "TIME";
public static final String DB_TIMESTAMPZ_TYPE = "TIMESTAMPZ";
public static final String DB_DATE_TYPE = "DATE";
public static final String DB_NUMERIC_TYPE = "NUMERIC";
public static final String DB_SMALLINT_TYPE = "SMALLINT";
public static final String DB_TINYINT_TYPE = "TINYINT";
public static final String DB_BYTE_TYPE = "BYTE";
public static final String DB_BLOB = "BLOB";
public static final String DB_CLOB = "CLOB";
public static final String DB_LONGTEXT = "LONGTEXT";
public static final String DB_LONGBLOB = "DB_LONGBLOB";
public static final String DB_LONGVARBINARY = "LONGVARBINARY";
public static final String DB_VARBINARY = "VARBINARY";
public static final String DB_BIGDECIMAL_TYPE = "BIGDECIMAL";
public static final String UML_STRING_TYPE = "string";
public static final String UML_INTEGER_TYPE = "integer";
public static final String UML_LONG_TYPE = "decimal";
public static final String UML_DOUBLE_TYPE = "double";
public static final String UML_BIGDECIMAL_TYPE = "bigdecimal";
public static final String UML_BYTE_TYPE = "byte";
private static Logger logger = Logger.getLogger(ConvertUtils.class);
public static String getDBFullTypeFromUMLType (String type) {
if (type==null) return DB_STRING_TYPE;
type = StringUtils.lowerCase(type);
if (UML_STRING_TYPE.equals(type)) return DB_STRING_TYPE;
if (UML_INTEGER_TYPE.equals(type)) return DB_INTEGER_TYPE;
if (UML_LONG_TYPE.equals(type)) return DB_DECIMAL_TYPE;
if (UML_DOUBLE_TYPE.equals(type)) return DB_DOUBLE_TYPE;
return DB_STRING_TYPE;
}
public static String getUMLTypeFromDBFullType(String type) {
if (type==null) return DB_STRING_TYPE;
type = StringUtils.upperCase(type);
if (DB_STRING_TYPE.equals(type)) return UML_STRING_TYPE;
if (DB_STRING2_TYPE.equals(type)) return UML_STRING_TYPE;
if (DB_STRING_CHAR_TYPE.equals(type)) return UML_STRING_TYPE;
if (DB_STRING2_CHAR_TYPE.equals(type)) return UML_STRING_TYPE;
if (DB_INTEGER_TYPE.equals(type)) return UML_INTEGER_TYPE;
if (DB_INT_TYPE.equals(type)) return UML_INTEGER_TYPE;
if (DB_SMALLINT_TYPE.equals(type)) return UML_INTEGER_TYPE;
if (DB_DECIMAL_TYPE.equals(type)) return UML_LONG_TYPE;
if (DB_DOUBLE_TYPE.equals(type)) return UML_DOUBLE_TYPE;
return UML_STRING_TYPE;
}
public static String getDDLUtilsTypeFromDBType (String type) {
return getDBFullTypeFromUMLType(getUMLTypeFromDBFullType(type.trim()));
// return (type==null)?DB_STRING_TYPE:type.toUpperCase();
}
public static String getJavaTypeFromDBFullType(String dBType, int size, String databaseType) {
String retStr=null;
if (dBType.equals("BOOLEAN"))
return JAVA_BOOLEAN_TYPE;
if (dBType.equals("BIGINT"))
return JAVA_LONG_TYPE;
if (dBType.equals("DOUBLE"))
return JAVA_BIGDECIMAL_TYPE;
if (dBType.equals("FLOAT"))
return JAVA_BIGDECIMAL_TYPE;
if (dBType.equals("INT"))
return JAVA_INTEGER_TYPE;
if (dBType.equals("TIME"))
return JAVA_TIME_TYPE;
if (dBType.equals("DECIMAL"))
return JAVA_BIGDECIMAL_TYPE;
if (dBType.equals("SMALLINT"))
return JAVA_INTEGER_TYPE;
if (dBType.equals(DB_TINYINT_TYPE))
return JAVA_SHORT_TYPE;
if (dBType.equals("VARCHAR"))
return JAVA_STRING_TYPE;
if (dBType.equals("LONGVARCHAR"))
return JAVA_STRING_TYPE;
if (dBType.equals("VARCHAR2"))
return JAVA_STRING_TYPE;
if (dBType.equals("VARGRAPHIC"))
return JAVA_STRING_TYPE;
if (dBType.equals("CHAR"))
return JAVA_STRING_TYPE;
if (dBType.equals("INTEGER"))
return JAVA_INTEGER_TYPE;
if (dBType.equals("NUMERIC"))
return JAVA_INTEGER_TYPE;
if (dBType.equals("NUMBER")
|| dBType.equals("REAL")
|| dBType.equals(DB_BYTE_TYPE)
)
{
if (size==1 ) //&&databaseType.equals(DB_TYPE_ORACLE) && )
return JAVA_BOOLEAN_TYPE;
return JAVA_LONG_TYPE;
}
if (dBType.equals("DATE"))
return JAVA_DATE_TYPE;
if (dBType.equals("TIMESTAMP"))
return JAVA_TIMESTAMP_TYPE;
if (dBType.equals("TIMESTAMPZ"))
return JAVA_TIMESTAMP_TYPE;
if (dBType.equals("BLOB"))
return JAVA_BLOB_TYPE;
if (dBType.equals("BINARY"))
return JAVA_BLOB_TYPE;
if (dBType.equals("CLOB"))
return JAVA_CLOB_TYPE;
if (dBType.equals("NVARCHAR2"))
return JAVA_STRING_TYPE;
if (dBType.equals("NVARCHAR"))
return JAVA_STRING_TYPE;
if (dBType.equals("VARBINARY"))
return JAVA_STRING_TYPE;
// to re implement when externalizing the mapping
if (dBType.equals("OTHER"))
return JAVA_STRING_TYPE;
return retStr;
}
public static String getJavaTypeFromDBFullType (Column column) {
if (column==null)
return null;
DATABASEenum type = null;
if (column.getTable()!=null
&& column.getTable().getDatabase()!=null) {
type=column.getTable().getDatabase().getType();
}
return getJavaTypeFromDBFullType(column.getTypeAlias(), //column.getType(),
column.getSizeAsInt(),
column.getScale(),
type);
}
public static String getJavaDefaultMask(Column column) {
String type = getJavaTypeFromDBFullType(column);
if (JAVA_BOOLEAN_TYPE.equals(type)) return "new Boolean(\"false\")";
if (JAVA_LONG_TYPE.equals(type)) return "Long.valueOf(-1)";
if (JAVA_DOUBLE_TYPE.equals(type)) return "Double.valueOf(-1)";
if (JAVA_INTEGER_TYPE.equals(type)) return "Integer.valueOf(-1)";
if (JAVA_TIMESTAMP_TYPE.equals(type)) return "null"; //not supported yet
if (JAVA_BIGDECIMAL_TYPE.equals(type)) return "java.math.BigDecimal.valueOf(-1)";
if (JAVA_STRING_TYPE.equals(type)) return "new String()";
if (JAVA_DATE_TYPE.equals(type)) return "new Date()";
if (JAVA_BLOB_TYPE.equals(type)) return "null";
if (JAVA_CLOB_TYPE.equals(type)) return "null";
return "null";
}
public static String getJavaTypeFromDBFullType(String dBType, int size, int scale, DATABASEenum databaseType) {
//String retStr = getJavaTypeFromDBFullType(dBType, size, databaseType);
if (dBType.equals("DECIMAL")) {
if (scale==0)
return JAVA_LONG_TYPE;
else
return JAVA_BIGDECIMAL_TYPE;
}
// if (dBType.equals("NUMBER") || dBType.equals("REAL") ) {
// if (databaseType.equals(DB_TYPE_ORACLE) && size==1 )
// return JAVA_BOOLEAN_TYPE;
// return JAVA_LONG_TYPE;
// }
return null;
}
public static String getJavaTypeClassFromDBType (Column column) {
return getJavaTypeClassFromDBType(column.getType(), column.getScale(), getDatabaseType(column));
}
private static DATABASEenum getDatabaseType (Column column) {
DATABASEenum databaseType = DATABASEenum.UNKNOWN;
if (column.getTable()!=null &&
column.getTable().getDatabase() != null)
databaseType = column.getTable().getDatabase().getType();
return databaseType;
}
public static String getJavaTypeClassFromDBType (String dBType, int scale, DATABASEenum databaseType) {
if (dBType==null){
String s = "ERROR column dBType is null";
logger.error(s);
return s;
}
if (dBType.equals("BOOLEAN"))
return "Boolean";
if (dBType.equals("NUMBER")
|| dBType.equals("REAL")
|| dBType.equals(DB_BYTE_TYPE)
)
{
if (scale==1) //DB_TYPE_ORACLE.equals(databaseType) && scale==1 )
return "Boolean";
}
if (dBType.equals("NUMERIC"))
return "Integer";
if (dBType.equals("BLOB"))
return "String";
if (dBType.equals("BINARY"))
return "String";
if (dBType.equals("CLOB"))
return "String";
return getJavaTypeFromDBTypeOnly (dBType, scale);
}
public static String getJavaTypeFromDBType (String dBType) {
//return StringUtils.
// TODO from getJavaTypeFromDBFullType
//String retStr=null;
if (dBType==null) return "String";
if (dBType.equals("BOOLEAN"))
return "Boolean";
if (dBType.equals("BIGINT"))
return "Long";
if (dBType.equals("DOUBLE"))
return "java.math.BigDecimal";
if (dBType.equals("FLOAT"))
return "java.math.BigDecimal";
if (dBType.equals("INT"))
return "Integer";
if (dBType.equals(DB_TIME_TYPE))
return JAVA_TIME_TYPE;
if (dBType.equals("DECIMAL"))
return "java.math.BigDecimal";
if (dBType.equals("SMALLINT"))
return "Integer";
if (dBType.equals(DB_TINYINT_TYPE))
return "Short";
if (dBType.equals("VARCHAR"))
return "String";
if (dBType.equals("LONGVARCHAR"))
return "String";
if (dBType.equals("VARCHAR2"))
return "String";
if (dBType.equals("VARGRAPHIC"))
return "String";
if (dBType.equals("CHAR"))
return "String";
if (dBType.equals("INTEGER"))
return "Integer";
if (dBType.equals("NUMBER"))
return "java.lang.Long";
if (dBType.equals("NUMERIC"))
return "java.lang.Integer";
if (dBType.equals("DATE"))
return "Date";
if (dBType.equals("TIMESTAMP") || DB_TIMESTAMPZ_TYPE.equals(dBType))
return "Timestamp";
if (dBType.equals("BLOB"))
return "Blob";
if (dBType.equals("BINARY"))
return "java.sql.Blob";
if (dBType.equals("CLOB"))
return "Clob";
// if (dBType.equals("BIT"))
// return "Long";
if (dBType.equals("NVARCHAR2"))
return "String";
if (dBType.equals("NVARCHAR"))
return "String";
// to re implement when externalizing the mapping
if (dBType.equals("OTHER"))
return "String";
if (dBType.equals("BIT")) //mysql
return "Boolean";
return "String";
}
public static String getJavaTypeFromDBType(Column column) {
return getJavaTypeFromDBType(column.getTypeAlias(),//column.getType(),
column.getScale(), getDatabaseType(column));
}
public static String getJavaTypeFromDBTypeOnly(String dBType, int scale) {
String retStr=getJavaTypeFromDBType (dBType);
if (dBType==null) return retStr;
if (dBType.equals("DECIMAL") || dBType.equals("NUMERIC") ) {
if (scale==0)
return "Long";
else
return "BigDecimal";
}
return retStr;
}
public static String getJavaTypeFromDBType(String dBType, int scale, DATABASEenum databaseType) {
String retStr=getJavaTypeFromDBType (dBType);
if (dBType==null) return retStr;
if (dBType.equals("DECIMAL")) {
if (scale==0)
return "Long";
else
return "java.math.BigDecimal";
}
if (dBType.equals("NUMBER")
|| dBType.equals("REAL")
|| dBType.equals(DB_BYTE_TYPE))
{
if (scale==1 )//DB_TYPE_ORACLE.equals(databaseType) && scale==1 )
return "Boolean";
}
return retStr;
}
public static String getJavaType (String input) {
input = StringUtils.upperCase(input);
if (input.endsWith("STRING")){
return "String";
}
return "no type found";
}
public static boolean isStringType(String dBType) {
return (getJavaTypeFromDBType(dBType).equals("String"))?true:false;
}
public static boolean isDateType(String dBType) {
return (FieldType.DATE.toString().equals(dBType) ||
FieldType.TIMESTAMP.toString().equals(dBType) ||
FieldType.TIME.toString().equals(dBType))?true:false;
}
public static boolean isNumberType(String dBType) {
return (FieldType.BIGINT.toString().equals(dBType) ||
FieldType.DECIMAL.toString().equals(dBType) ||
FieldType.INTEGER.toString().equals(dBType))?true:false;
}
public static boolean isBooleanType(String dBType) {
return (FieldType.BOOLEAN.toString().equals(dBType)||
FieldType.BIT.toString().equals(dBType))?true:false;
}
}