package io.ebeaninternal.server.type;
import io.ebean.config.JsonConfig;
import io.ebean.config.ServerConfig;
import io.ebeaninternal.server.core.BasicTypeConverter;
import java.math.BigInteger;
import java.sql.Types;
import java.util.Calendar;
/**
* Helper to create some default ScalarType objects for Booleans,
* java.util.Date, java.util.Calendar etc.
*/
public class DefaultTypeFactory {
private final ServerConfig serverConfig;
public DefaultTypeFactory(ServerConfig serverConfig) {
this.serverConfig = serverConfig;
}
protected ScalarTypeBool createBoolean(String trueValue, String falseValue) {
try {
// first try Integer based boolean
Integer intTrue = BasicTypeConverter.toInteger(trueValue);
Integer intFalse = BasicTypeConverter.toInteger(falseValue);
return new ScalarTypeBoolean.IntBoolean(intTrue, intFalse);
} catch (NumberFormatException e) {
// treat as Varchar/String based boolean
return new ScalarTypeBoolean.StringBoolean(trueValue, falseValue);
}
}
/**
* Create the ScalarType for mapping Booleans. For some databases this is a
* native data type and for others Booleans will be converted to Y/N or 0/1
* etc.
*/
public ScalarTypeBool createBoolean() {
if (serverConfig == null) {
return new ScalarTypeBoolean.Native();
}
String trueValue = serverConfig.getDatabaseBooleanTrue();
String falseValue = serverConfig.getDatabaseBooleanFalse();
if (falseValue != null && trueValue != null) {
// explicit integer or string based booleans
return createBoolean(trueValue, falseValue);
}
// determine based on database platform configuration
int booleanDbType = serverConfig.getDatabasePlatform().getBooleanDbType();
// Some dbs use BIT e.g. MySQL
if (booleanDbType == Types.BIT) {
return new ScalarTypeBoolean.BitBoolean();
}
if (booleanDbType == Types.INTEGER) {
return new ScalarTypeBoolean.IntBoolean(1, 0);
}
if (booleanDbType == Types.VARCHAR) {
return new ScalarTypeBoolean.StringBoolean("T", "F");
}
if (booleanDbType == Types.BOOLEAN) {
return new ScalarTypeBoolean.Native();
}
// assume the JDBC driver can convert the type
return new ScalarTypeBoolean.Native();
}
/**
* Create the default ScalarType for java.util.Date.
*/
public ScalarType<java.util.Date> createUtilDate(JsonConfig.DateTime mode) {
// by default map anonymous java.util.Date to java.sql.Timestamp.
// String mapType =
// properties.getProperty("type.mapping.java.util.Date","timestamp");
int utilDateType = getTemporalMapType("timestamp");
return createUtilDate(mode, utilDateType);
}
/**
* Create a ScalarType for java.util.Date explicitly specifying the type to
* map to.
*/
public ScalarType<java.util.Date> createUtilDate(JsonConfig.DateTime mode, int utilDateType) {
switch (utilDateType) {
case Types.DATE:
return new ScalarTypeUtilDate.DateType();
case Types.TIMESTAMP:
return new ScalarTypeUtilDate.TimestampType(mode);
default:
throw new RuntimeException("Invalid type " + utilDateType);
}
}
/**
* Create the default ScalarType for java.util.Calendar.
*/
public ScalarType<Calendar> createCalendar(JsonConfig.DateTime mode) {
int jdbcType = getTemporalMapType("timestamp");
return createCalendar(mode, jdbcType);
}
/**
* Create a ScalarType for java.util.Calendar explicitly specifying the type
* to map to.
*/
public ScalarType<Calendar> createCalendar(JsonConfig.DateTime mode, int jdbcType) {
return new ScalarTypeCalendar(mode, jdbcType);
}
private int getTemporalMapType(String mapType) {
if (mapType.equalsIgnoreCase("date")) {
return java.sql.Types.DATE;
}
return java.sql.Types.TIMESTAMP;
}
/**
* Create a ScalarType for java.math.BigInteger.
*/
public ScalarType<BigInteger> createMathBigInteger() {
return new ScalarTypeMathBigInteger();
}
}