4.2.2.3. Datatype
Datatype
interface describes a valid data type for the entity attribute if it is not a reference. Each Datatype
implementation corresponds to a single Java class.
All of the instances are registered in repository – Datatypes
class, which performs loading and initializing of Datatype
implementation classes in the following way:
-
datatypes.xml file is searched in
CLASSPATH
root, and if it is found,Datatypes
repository is initialized from it. -
otherwise
Datatypes
repository is initialized from/com/haulmont/chile/core/datatypes/datatypes.xml
file.
Datatype
instance can be obtained in two ways:
-
For an entity attribute – from the corresponding meta-property using
getRange().asDatatype()
call. -
Using
Datatypes.get()
static method by passing to it the name of theDatatype
implementation or Java class it was created for.
Datatypes
are associated with entity attributes during application start according to the following rules:
-
If
@MetaProperty
annotation is defined on the field or method having a non-emptydatatype
value, the attribute is associated with theDatatype
instance with the given name.For instance, if the entity attribute is declared as in the example below, it will be associated with a nonstandard type –
GeoCoordinateDatatype
:@MetaProperty(datatype = GeoCoordinateDatatype.NAME) @Column(name = "LATITUDE") private Double latitude;
-
In most cases, explicit specification is omitted, and the attribute is associated with the
Datatype
instance from repository, which is returned byDatatypes.get(Class)
by supplied field or method type.In example below,
latitude
attribute will get a standardDoubleDatatype
type registered in the/com/haulmont/chile/core/datatypes/datatypes.xml
base file:@Column(name = "LATITUDE") private Double latitude;
Basic methods of Datatype
interfaces:
-
getName()
– returns the unique name of the implementation. -
format()
– converts the passed value into a string. -
parse()
– transforms a string into the value of corresponding type.
Datatype
determines two sets of methods for formatting and parsing: considering and not considering locale. Conversion considering locale is applied everywhere in user interface, ignoring locale – in system mechanisms, for example, serialization in REST API.
Parsing formats ignoring locale are specified in the above mentioned datatypes.xml file.
The parsing formats considering locale are provided in the main localized messages pack, in the strings containing the following keys:
-
numberDecimalSeparator
– specifies decimal separator for numeric types. -
numberGroupingSeparator
– defines separator between digits groups for numeric types (e.g. when space is used as separator, number will be formatted as 1 000 000). -
integerFormat
– format forInteger
andLong
types. -
doubleFormat
– format forDouble
type. -
decimalFormat
– format for `BigDecimal `type. -
dateTimeFormat
– format forjava.util.Date
type. -
dateFormat
– format forjava.sql.Date
type. -
timeFormat
– format forjava.sql.Time
type. -
trueString
– string corresponding toBoolean.TRUE
. -
falseString
– string corresponding toBoolean.FALSE
.
All the listed formats are specified in the main localized message pack of CUBA base projects by default, and can be overridden in the similar files of the application project.