-
- Type Parameters:
T- the java type described by this data type
- All Known Implementing Classes:
AbstractDataType,AbstractDateTimeType,AbstractNumberType,BigDecimalType,BinaryType,BMoneyType,BooleanPrimitiveType,BooleanType,BytePrimitiveType,ByteType,CharacterPrimitiveType,CharacterType,ConvertibleType,DateType,DMoneyType,DoublePrimitiveType,DoubleType,FloatPrimitiveType,FloatType,IntegerPrimitiveType,IntegerType,LargeStringType,LocalDateTimeType,LocalDateType,LocalTimeType,LongPrimitiveType,LongType,ShortPrimitiveType,ShortType,StringType,TimestampType,TimeType
public interface DataType<T>The data type.
Describes a type from the model perspective and maps it to one or moreSqlTypes, each corresponding to a database column.Implementations must be annotated with
@Service(DataType.class). DataTypes are singletons and loaded by theDataTypeFactory. Hence, they must not maintain any state and the==operator is logically equivalent to equals().A predefined set of commonly used Java- and Tentackle-types is already provided, but the application may define their own types (that's why
DataTypeis not an enum).
The combination ofjavaNameandvariantis unique. ThejavaNameis the plain classname without the package, since we don't want the model to refer to classes with the same name, but in different packages (usually a bad idea anyway).The use of
DataTypes is threefold:- for the model's attributes that refer to known types
- for the wurblets to generate type-specific code
- for application-specific types used at runtime by the peristence layer
The methodisPredefined()must return false. Otherwise the wurblets assume that type-specific methods exist and generate uncompilable code.
Furthermore, sinceDataTypes refer to the corresponding Java type, they should reside in a separate module the java type's module does not depend on. Otherwise all application modules would refer to the tentackle-sql module, which is not desired for the PDO module(s).Finally, the
DataType's module must be made known to the following maven plugins:- wurbelizer plugin: add as
wurbletDependency(see the wurbelizer docs) - tentackle sql plugin: add as plugin dependency
-
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description Tget(Backend backend, java.sql.ResultSet resultSet, int[] pos, boolean mapNull, java.lang.Integer size)Gets the object from a result set.
Must be implemented ifisPredefined()returns false.intgetColumnCount()Gets the number of database columns.
A tentackle type may be mapped to more than one column for multi-column types such asBMoney.java.lang.StringgetColumnGetter(int index)Gets the java getter name of a column.java.util.Optional<java.lang.String>getColumnSuffix(int index)Gets the optional suffix.
Suffixes usually begin with an underscore.java.lang.ObjectgetColumnValue(int index, T value)Gets the value of a column.java.util.Optional<java.lang.String>getCommentSuffix(int index)Gets the optional comment suffix.
If present, it will be appended to the comment.java.lang.StringgetDataTypeConstant()Gets the name of the datatype constant.java.lang.StringgetJavaType()Gets the name of the Java type.intgetScale(int index, java.lang.Integer scale)Gets the column scale.intgetSize(int index, java.lang.Integer size)Gets the column size.SqlTypegetSqlType(int index)Gets the SQL type.java.lang.StringgetVariant()Gets the optional variant of the type.booleanisBool()Returns whether this is a boolean or Boolean type.booleanisDateOrTime()Returns whether this is a date and/or time type.booleanisDowncastNecessary()For certain numeric types, downcasts are necessary when assigning literals.booleanisJavaTypeGenerified()Returns whether the inner type describes a generified java type.
ImpliesisModelProvidingInnerType().booleanisLiteralSupported()Returns whether this type can be used literally in a query String.booleanisMapNullSupported()Returns whether this type supports mapping null values to some well-defined constant.booleanisModelProvidingInnerType()Returns whether the model provides an inner type.booleanisMutable()Returns whether type is a mutable java object.
Mutable objects may change their state and must implementFreezable.booleanisNumeric()Returns whether this is a numeric type.booleanisPredefined()Returns whether this is a predefined type.booleanisPrimitive()Returns whether type is a primitive.booleanisUTCSupported()Returns whether this type supports the UTC option.java.lang.Object[]set(Backend backend, java.sql.PreparedStatement statement, int pos, T object, boolean mapNull, java.lang.Integer size)Sets the object into a prepared statement.
Must be implemented ifisPredefined()returns false.java.lang.Objectset(Backend backend, java.sql.PreparedStatement statement, int pos, T object, int index, boolean mapNull, java.lang.Integer size)Sets a column of an object into a prepared statement.
Must be implemented ifisPredefined()returns false.java.lang.StringtoLiteral(java.lang.String str)Takes the string representation of a value and converts it to an SQL literal.
Some types need single quotes, for example.DataType<?>toNonPrimitive()Gets the non-primitive type if this is a primitive.java.util.Optional<DataType<?>>toPrimitive()Gets the primitive type if this is a non-primitive.java.lang.StringtoString(T object)Takes an object and converts it to a string that can in turn be parsed withvalueOf(String).
The method is used to print a literal (for example the default value of a dumped attribute).TvalueOf(java.lang.String str)Parses a string and converts to the value of this type.
The method is used to parse a literal (for example the default value defined in the model).java.lang.StringvalueOfLiteralToCode(java.lang.String str)Creates the java code to apply the valueOf method to a String.
-
-
-
Method Detail
-
getJavaType
java.lang.String getJavaType()
Gets the name of the Java type.- Returns:
- the type
-
getVariant
java.lang.String getVariant()
Gets the optional variant of the type.- Returns:
- the variant, empty string if none, never null
-
isPredefined
boolean isPredefined()
Returns whether this is a predefined type.- Returns:
- true if explicit methods provided by the persistence layer, false if generic methods must be used
-
isPrimitive
boolean isPrimitive()
Returns whether type is a primitive.- Returns:
- true if primitive
-
toNonPrimitive
DataType<?> toNonPrimitive()
Gets the non-primitive type if this is a primitive.- Returns:
- the non-primitive type, this type if it is already a non-primitive
-
toPrimitive
java.util.Optional<DataType<?>> toPrimitive()
Gets the primitive type if this is a non-primitive.- Returns:
- the primitive type if there is one
-
isMutable
boolean isMutable()
Returns whether type is a mutable java object.
Mutable objects may change their state and must implementFreezable.- Returns:
- true if mutable and freezable
-
isNumeric
boolean isNumeric()
Returns whether this is a numeric type.- Returns:
- true if numeric
-
isDateOrTime
boolean isDateOrTime()
Returns whether this is a date and/or time type.- Returns:
- true if time, date or timestamp
-
isBool
boolean isBool()
Returns whether this is a boolean or Boolean type.- Returns:
- true if bool
-
getColumnCount
int getColumnCount()
Gets the number of database columns.
A tentackle type may be mapped to more than one column for multi-column types such asBMoney.- Returns:
- default is 1
-
getSqlType
SqlType getSqlType(int index)
Gets the SQL type.- Parameters:
index- the column index- Returns:
- the SQL type
-
getSize
int getSize(int index, java.lang.Integer size)Gets the column size.- Parameters:
index- the column indexsize- the size from the model- Returns:
- the column size
-
getScale
int getScale(int index, java.lang.Integer scale)Gets the column scale.- Parameters:
index- the column indexscale- the scale from the model- Returns:
- the column scale
-
getColumnValue
java.lang.Object getColumnValue(int index, T value)Gets the value of a column.- Parameters:
index- the column indexvalue- the datatype's value according to the model- Returns:
- the column's value
-
getColumnGetter
java.lang.String getColumnGetter(int index)
Gets the java getter name of a column.- Parameters:
index- the datatype's value according to the model- Returns:
- the column's getter name, empty string if this is a single column type
-
getColumnSuffix
java.util.Optional<java.lang.String> getColumnSuffix(int index)
Gets the optional suffix.
Suffixes usually begin with an underscore.- Parameters:
index- the column index- Returns:
- the optional suffix
-
getCommentSuffix
java.util.Optional<java.lang.String> getCommentSuffix(int index)
Gets the optional comment suffix.
If present, it will be appended to the comment.Important: for datatypes with more than one column, none or exactly one should be without suffix. See WurbletArgument in tentackle-wurblets.
- Parameters:
index- the column index- Returns:
- the optional suffix
-
isMapNullSupported
boolean isMapNullSupported()
Returns whether this type supports mapping null values to some well-defined constant.- Returns:
- true if mapNull supported
-
isUTCSupported
boolean isUTCSupported()
Returns whether this type supports the UTC option.- Returns:
- true if UTC supported
-
isDowncastNecessary
boolean isDowncastNecessary()
For certain numeric types, downcasts are necessary when assigning literals.- Returns:
- true if downcast is necessary
-
isModelProvidingInnerType
boolean isModelProvidingInnerType()
Returns whether the model provides an inner type.- Returns:
- true if inner type is specified within angle brackets, false if standard type
-
isJavaTypeGenerified
boolean isJavaTypeGenerified()
Returns whether the inner type describes a generified java type.
ImpliesisModelProvidingInnerType().- Returns:
- true if javaType<T>, else simple type
-
isLiteralSupported
boolean isLiteralSupported()
Returns whether this type can be used literally in a query String.- Returns:
- true if literal String supported, else false
-
toLiteral
java.lang.String toLiteral(java.lang.String str)
Takes the string representation of a value and converts it to an SQL literal.
Some types need single quotes, for example.- Parameters:
str- the value string- Returns:
- the SQL literal
-
valueOf
T valueOf(java.lang.String str)
Parses a string and converts to the value of this type.
The method is used to parse a literal (for example the default value defined in the model).Notice: the method doesn't use any locale, so the results are always the same regardless of the JVM's locale.
- Parameters:
str- the source string- Returns:
- the value
-
valueOfLiteralToCode
java.lang.String valueOfLiteralToCode(java.lang.String str)
Creates the java code to apply the valueOf method to a String.- Parameters:
str- the literal to be parsed- Returns:
- the java code
-
toString
java.lang.String toString(T object)
Takes an object and converts it to a string that can in turn be parsed withvalueOf(String).
The method is used to print a literal (for example the default value of a dumped attribute).Notice: the method doesn't use any locale, so the results are always the same regardless of the JVM's locale.
- Parameters:
object- the object of this DataType- Returns:
- the printable string
-
getDataTypeConstant
java.lang.String getDataTypeConstant()
Gets the name of the datatype constant.- Returns:
- the DT_...
-
set
java.lang.Object[] set(Backend backend, java.sql.PreparedStatement statement, int pos, T object, boolean mapNull, java.lang.Integer size) throws java.sql.SQLException
Sets the object into a prepared statement.
Must be implemented ifisPredefined()returns false. Not invoked by framework otherwise.- Parameters:
backend- the database backendstatement- the prepared statementpos- the position of the first SQL valueobject- the object, may be nullmapNull- true if map null-values to non-null valuessize- the optional size specified in the model- Returns:
- the values stored in the prepared statement
- Throws:
java.sql.SQLException- if failed
-
set
java.lang.Object set(Backend backend, java.sql.PreparedStatement statement, int pos, T object, int index, boolean mapNull, java.lang.Integer size) throws java.sql.SQLException
Sets a column of an object into a prepared statement.
Must be implemented ifisPredefined()returns false. Not invoked by framework otherwise.- Parameters:
backend- the database backendstatement- the prepared statementpos- the position of the first SQL valueobject- the object, may be nullindex- the column indexmapNull- true if map null-values to non-null valuessize- the optional size specified in the model- Returns:
- the object stored in the prepared statement
- Throws:
java.sql.SQLException- if failed
-
get
T get(Backend backend, java.sql.ResultSet resultSet, int[] pos, boolean mapNull, java.lang.Integer size) throws java.sql.SQLException
Gets the object from a result set.
Must be implemented ifisPredefined()returns false. Not invoked by framework otherwise.- Parameters:
backend- the database backendresultSet- the result setpos- the column positions in the result setmapNull- true if unmap null-values from non-null valuessize- the optional size specified in the model- Returns:
- the object or null if column(s) IS NULL
- Throws:
java.sql.SQLException- if failed
-
-