Skip to content

Commit 93887cb

Browse files
committed
misc code cleanups around UserTypes
1 parent e4619c3 commit 93887cb

File tree

5 files changed

+154
-203
lines changed

5 files changed

+154
-203
lines changed

hibernate-core/src/main/java/org/hibernate/type/CustomType.java

Lines changed: 63 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import org.hibernate.engine.internal.CacheHelper;
1818
import org.hibernate.engine.spi.SessionFactoryImplementor;
1919
import org.hibernate.engine.spi.SharedSessionContractImplementor;
20-
import org.hibernate.internal.util.collections.ArrayHelper;
2120
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
2221
import org.hibernate.type.descriptor.ValueBinder;
2322
import org.hibernate.type.descriptor.ValueExtractor;
@@ -26,14 +25,16 @@
2625
import org.hibernate.type.descriptor.jdbc.JdbcLiteralFormatter;
2726
import org.hibernate.type.descriptor.jdbc.JdbcType;
2827
import org.hibernate.type.internal.UserTypeJavaTypeWrapper;
29-
import org.hibernate.type.internal.UserTypeSqlTypeAdapter;
28+
import org.hibernate.type.internal.UserTypeJdbcTypeAdapter;
3029
import org.hibernate.type.internal.UserTypeVersionJavaTypeWrapper;
3130
import org.hibernate.type.spi.TypeConfiguration;
3231
import org.hibernate.usertype.EnhancedUserType;
3332
import org.hibernate.usertype.LoggableUserType;
3433
import org.hibernate.usertype.UserType;
3534
import org.hibernate.usertype.UserVersionType;
3635

36+
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_STRING_ARRAY;
37+
3738
/**
3839
* Adapts {@link UserType} to the generic {@link Type} interface, in order
3940
* to isolate user code from changes in the internal Type contracts.
@@ -63,36 +64,22 @@ public class CustomType<J>
6364
private final JdbcLiteralFormatter<J> jdbcLiteralFormatter;
6465

6566
public CustomType(UserType<J> userType, TypeConfiguration typeConfiguration) throws MappingException {
66-
this( userType, ArrayHelper.EMPTY_STRING_ARRAY, typeConfiguration );
67+
this( userType, EMPTY_STRING_ARRAY, typeConfiguration );
6768
}
6869

69-
public CustomType(UserType<J> userType, String[] registrationKeys, TypeConfiguration typeConfiguration)
70-
throws MappingException {
70+
public CustomType(UserType<J> userType, String[] registrationKeys, TypeConfiguration typeConfiguration) {
7171
this.userType = userType;
7272
name = userType.getClass().getName();
7373

74-
if ( userType instanceof JavaType<?> ) {
75-
//noinspection unchecked
76-
mappedJavaType = (JavaType<J>) userType;
77-
}
78-
else if ( userType instanceof JavaTypedExpressible) {
79-
//noinspection unchecked
80-
mappedJavaType = ( (JavaTypedExpressible<J>) userType ).getExpressibleJavaType();
81-
}
82-
else if ( userType instanceof UserVersionType ) {
83-
mappedJavaType = new UserTypeVersionJavaTypeWrapper<>( (UserVersionType<J>) userType );
84-
}
85-
else {
86-
mappedJavaType = new UserTypeJavaTypeWrapper<>( userType );
87-
}
74+
mappedJavaType = getMappedJavaType( userType );
8875

89-
final BasicValueConverter<J, Object> valueConverter = userType.getValueConverter();
90-
if ( valueConverter != null ) {
76+
final BasicValueConverter<J, Object> converter = userType.getValueConverter();
77+
if ( converter != null ) {
9178
// When an explicit value converter is given,
9279
// we configure the custom type to use that instead of adapters that delegate to UserType.
9380
// This is necessary to support selecting a column with multiple domain type representations.
9481
jdbcType = userType.getJdbcType( typeConfiguration );
95-
jdbcJavaType = valueConverter.getRelationalJavaType();
82+
jdbcJavaType = converter.getRelationalJavaType();
9683
//noinspection unchecked
9784
valueExtractor = (ValueExtractor<J>) jdbcType.getExtractor( jdbcJavaType );
9885
//noinspection unchecked
@@ -102,18 +89,34 @@ else if ( userType instanceof UserVersionType ) {
10289
}
10390
else {
10491
// create a JdbcType adapter that uses the UserType binder/extract handling
105-
jdbcType = new UserTypeSqlTypeAdapter<>( userType, mappedJavaType, typeConfiguration );
92+
jdbcType = new UserTypeJdbcTypeAdapter<>( userType, mappedJavaType );
10693
jdbcJavaType = jdbcType.getJdbcRecommendedJavaTypeMapping( null, null, typeConfiguration );
10794
valueExtractor = jdbcType.getExtractor( mappedJavaType );
10895
valueBinder = jdbcType.getBinder( mappedJavaType );
109-
jdbcLiteralFormatter = userType instanceof EnhancedUserType
110-
? jdbcType.getJdbcLiteralFormatter( mappedJavaType )
111-
: null;
96+
jdbcLiteralFormatter =
97+
userType instanceof EnhancedUserType ? jdbcType.getJdbcLiteralFormatter( mappedJavaType ) : null;
11298
}
11399

114100
this.registrationKeys = registrationKeys;
115101
}
116102

103+
private JavaType<J> getMappedJavaType(UserType<J> userType) {
104+
if ( userType instanceof JavaType<?> ) {
105+
//noinspection unchecked
106+
return (JavaType<J>) userType;
107+
}
108+
else if ( userType instanceof JavaTypedExpressible<?> ) {
109+
//noinspection unchecked
110+
return ( (JavaTypedExpressible<J>) userType).getExpressibleJavaType();
111+
}
112+
else if ( userType instanceof UserVersionType<J> userVersionType ) {
113+
return new UserTypeVersionJavaTypeWrapper<>( userVersionType );
114+
}
115+
else {
116+
return new UserTypeJavaTypeWrapper<>( userType );
117+
}
118+
}
119+
117120
public UserType<J> getUserType() {
118121
return userType;
119122
}
@@ -176,13 +179,8 @@ public Object assemble(Serializable cached, SharedSessionContractImplementor ses
176179
// in which case we will try to use a converter for assembling,
177180
// or if that doesn't exist, simply use the relational value as is
178181
if ( assembled == null && cached != null ) {
179-
final BasicValueConverter<J, Object> valueConverter = getUserType().getValueConverter();
180-
if ( valueConverter == null ) {
181-
return cached;
182-
}
183-
else {
184-
return valueConverter.toDomainValue( cached );
185-
}
182+
final BasicValueConverter<J, Object> converter = getUserType().getValueConverter();
183+
return converter == null ? cached : converter.toDomainValue( cached );
186184
}
187185
return assembled;
188186
}
@@ -193,7 +191,7 @@ public Serializable disassemble(Object value, SharedSessionContractImplementor s
193191
}
194192

195193
@Override
196-
public Serializable disassemble(Object value, SessionFactoryImplementor sessionFactory) throws HibernateException {
194+
public Serializable disassemble(Object value, SessionFactoryImplementor sessionFactory) {
197195
return disassembleForCache( value );
198196
}
199197

@@ -204,27 +202,19 @@ private Serializable disassembleForCache(Object value) {
204202
// in which case we will try to use a converter for disassembling,
205203
// or if that doesn't exist, simply use the domain value as is
206204
if ( disassembled == null ){
207-
final BasicValueConverter<J, Object> valueConverter = getUserType().getValueConverter();
208-
if ( valueConverter == null ) {
209-
return disassembled;
210-
}
211-
else {
212-
return (Serializable) valueConverter.toRelationalValue( (J) value );
213-
}
205+
final BasicValueConverter<J, Object> converter = getUserType().getValueConverter();
206+
return converter == null ? disassembled : (Serializable) converter.toRelationalValue( (J) value );
207+
}
208+
else {
209+
return disassembled;
214210
}
215-
return disassembled;
216211
}
217212

218213
@Override
219214
public Object disassemble(Object value, SharedSessionContractImplementor session) {
220215
// Use the value converter if available for conversion to the jdbc representation
221-
final BasicValueConverter<J, Object> valueConverter = getUserType().getValueConverter();
222-
if ( valueConverter == null ) {
223-
return value;
224-
}
225-
else {
226-
return valueConverter.toRelationalValue( (J) value );
227-
}
216+
final BasicValueConverter<J, Object> converter = getUserType().getValueConverter();
217+
return converter == null ? value : converter.toRelationalValue( (J) value );
228218
}
229219

230220
@Override
@@ -240,12 +230,7 @@ public void addToCacheKey(MutableCacheKeyBuilder cacheKey, Object value, SharedS
240230
}
241231
else {
242232
cacheKey.addValue( disassembled );
243-
if ( value == null ) {
244-
cacheKey.addHashCode( 0 );
245-
}
246-
else {
247-
cacheKey.addHashCode( getUserType().hashCode( (J) value ) );
248-
}
233+
cacheKey.addHashCode( value == null ? 0 : getUserType().hashCode( (J) value ) );
249234
}
250235
}
251236

@@ -255,7 +240,7 @@ public Object replace(
255240
Object target,
256241
SharedSessionContractImplementor session,
257242
Object owner,
258-
Map<Object, Object> copyCache) throws HibernateException {
243+
Map<Object, Object> copyCache) {
259244
return getUserType().replace( (J) original, (J) target, owner );
260245
}
261246

@@ -302,8 +287,8 @@ public String toLoggableString(Object value, SessionFactoryImplementor factory)
302287
if ( value == null ) {
303288
return "null";
304289
}
305-
else if ( userType instanceof LoggableUserType ) {
306-
return ( (LoggableUserType) userType ).toLoggableString( value, factory );
290+
else if ( userType instanceof LoggableUserType loggableUserType ) {
291+
return loggableUserType.toLoggableString( value, factory );
307292
}
308293
else if ( userType instanceof EnhancedUserType<?> ) {
309294
return ( (EnhancedUserType<Object>) userType ).toString( value );
@@ -315,32 +300,32 @@ else if ( userType instanceof EnhancedUserType<?> ) {
315300

316301
@Override
317302
public boolean[] toColumnNullness(Object value, MappingContext mapping) {
318-
boolean[] result = new boolean[ getColumnSpan(mapping) ];
303+
final boolean[] result = new boolean[ getColumnSpan(mapping) ];
319304
if ( value != null ) {
320-
Arrays.fill(result, true);
305+
Arrays.fill( result, true );
321306
}
322307
return result;
323308
}
324309

325310
@Override
326311
public boolean isDirty(Object old, Object current, boolean[] checkable, SharedSessionContractImplementor session)
327312
throws HibernateException {
328-
return checkable[0] && isDirty(old, current, session);
313+
return checkable[0] && isDirty( old, current, session );
329314
}
330315

331316
@Override
332317
public boolean canDoSetting() {
333-
if ( getUserType() instanceof ProcedureParameterNamedBinder ) {
334-
return ((ProcedureParameterNamedBinder<?>) getUserType() ).canDoSetting();
335-
}
336-
return false;
318+
return getUserType() instanceof ProcedureParameterNamedBinder<?> procedureParameterNamedBinder
319+
&& procedureParameterNamedBinder.canDoSetting();
337320
}
338321

339322
@Override
340-
public void nullSafeSet(
341-
CallableStatement statement, J value, String name, SharedSessionContractImplementor session) throws SQLException {
323+
public void nullSafeSet(CallableStatement statement, J value, String name, SharedSessionContractImplementor session)
324+
throws SQLException {
342325
if ( canDoSetting() ) {
343-
((ProcedureParameterNamedBinder<J>) getUserType() ).nullSafeSet( statement, value, name, session );
326+
//noinspection unchecked
327+
( (ProcedureParameterNamedBinder<J>) getUserType() )
328+
.nullSafeSet( statement, value, name, session );
344329
}
345330
else {
346331
throw new UnsupportedOperationException(
@@ -351,17 +336,17 @@ public void nullSafeSet(
351336

352337
@Override
353338
public boolean canDoExtraction() {
354-
if ( getUserType() instanceof ProcedureParameterExtractionAware ) {
355-
return ((ProcedureParameterExtractionAware<?>) getUserType() ).canDoExtraction();
356-
}
357-
return false;
339+
return getUserType() instanceof ProcedureParameterExtractionAware<?> procedureParameterExtractionAware
340+
&& procedureParameterExtractionAware.canDoExtraction();
358341
}
359342

360343
@Override
361-
public J extract(CallableStatement statement, int startIndex, SharedSessionContractImplementor session) throws SQLException {
344+
public J extract(CallableStatement statement, int startIndex, SharedSessionContractImplementor session)
345+
throws SQLException {
362346
if ( canDoExtraction() ) {
363347
//noinspection unchecked
364-
return ((ProcedureParameterExtractionAware<J>) getUserType() ).extract( statement, startIndex, session );
348+
return ((ProcedureParameterExtractionAware<J>) getUserType() )
349+
.extract( statement, startIndex, session );
365350
}
366351
else {
367352
throw new UnsupportedOperationException(
@@ -375,7 +360,8 @@ public J extract(CallableStatement statement, String paramName, SharedSessionCon
375360
throws SQLException {
376361
if ( canDoExtraction() ) {
377362
//noinspection unchecked
378-
return ((ProcedureParameterExtractionAware<J>) getUserType() ).extract( statement, paramName, session );
363+
return ((ProcedureParameterExtractionAware<J>) getUserType() )
364+
.extract( statement, paramName, session );
379365
}
380366
else {
381367
throw new UnsupportedOperationException(
@@ -391,7 +377,8 @@ public int hashCode() {
391377

392378
@Override
393379
public boolean equals(Object obj) {
394-
return ( obj instanceof CustomType ) && getUserType().equals( ( (CustomType<?>) obj ).getUserType() );
380+
return obj instanceof CustomType<?> customType
381+
&& getUserType().equals( customType.getUserType() );
395382
}
396383

397384
@Override

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/DurationJavaType.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,26 @@ public String toString(Duration value) {
6060
if ( value == null ) {
6161
return null;
6262
}
63-
String seconds = String.valueOf( value.getSeconds() );
64-
String nanos = String.valueOf( value.getNano() );
65-
String zeros = StringHelper.repeat( '0', 9 - nanos.length() );
63+
else {
64+
final String seconds = String.valueOf( value.getSeconds() );
65+
final String nanos = String.valueOf( value.getNano() );
66+
final String zeros = StringHelper.repeat( '0', 9 - nanos.length() );
6667
return seconds + zeros + nanos;
68+
}
6769
}
6870

6971
@Override
7072
public Duration fromString(CharSequence string) {
7173
if ( string == null ) {
7274
return null;
7375
}
74-
int cutoff = string.length() - 9;
75-
return Duration.ofSeconds(
76-
Long.parseLong( string.subSequence( 0, cutoff ).toString() ),
77-
Long.parseLong( string.subSequence( cutoff, string.length() ).toString() )
78-
);
76+
else {
77+
final int cutoff = string.length() - 9;
78+
return Duration.ofSeconds(
79+
Long.parseLong( string.subSequence( 0, cutoff ).toString() ),
80+
Long.parseLong( string.subSequence( cutoff, string.length() ).toString() )
81+
);
82+
}
7983
}
8084

8185
@Override

hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/JdbcType.java

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -312,53 +312,24 @@ default CastType getCastType() {
312312
}
313313

314314
static CastType getCastType(int typeCode) {
315-
switch ( typeCode ) {
316-
case INTEGER:
317-
case TINYINT:
318-
case SMALLINT:
319-
return CastType.INTEGER;
320-
case BIGINT:
321-
return CastType.LONG;
322-
case FLOAT:
323-
case REAL:
324-
return CastType.FLOAT;
325-
case DOUBLE:
326-
return CastType.DOUBLE;
327-
case CHAR:
328-
case NCHAR:
329-
case VARCHAR:
330-
case NVARCHAR:
331-
case LONGVARCHAR:
332-
case LONGNVARCHAR:
333-
return CastType.STRING;
334-
case CLOB:
335-
return CastType.CLOB;
336-
case BOOLEAN:
337-
return CastType.BOOLEAN;
338-
case DECIMAL:
339-
case NUMERIC:
340-
return CastType.FIXED;
341-
case DATE:
342-
return CastType.DATE;
343-
case TIME:
344-
case TIME_UTC:
345-
case TIME_WITH_TIMEZONE:
346-
return CastType.TIME;
347-
case TIMESTAMP:
348-
return CastType.TIMESTAMP;
349-
case TIMESTAMP_WITH_TIMEZONE:
350-
return CastType.OFFSET_TIMESTAMP;
351-
case JSON:
352-
case JSON_ARRAY:
353-
return CastType.JSON;
354-
case SQLXML:
355-
case XML_ARRAY:
356-
return CastType.XML;
357-
case NULL:
358-
return CastType.NULL;
359-
default:
360-
return CastType.OTHER;
361-
}
315+
return switch ( typeCode ) {
316+
case INTEGER, TINYINT, SMALLINT -> CastType.INTEGER;
317+
case BIGINT -> CastType.LONG;
318+
case FLOAT, REAL -> CastType.FLOAT;
319+
case DOUBLE -> CastType.DOUBLE;
320+
case CHAR, NCHAR, VARCHAR, NVARCHAR, LONGVARCHAR, LONGNVARCHAR -> CastType.STRING;
321+
case CLOB -> CastType.CLOB;
322+
case BOOLEAN -> CastType.BOOLEAN;
323+
case DECIMAL, NUMERIC -> CastType.FIXED;
324+
case DATE -> CastType.DATE;
325+
case TIME, TIME_UTC, TIME_WITH_TIMEZONE -> CastType.TIME;
326+
case TIMESTAMP -> CastType.TIMESTAMP;
327+
case TIMESTAMP_WITH_TIMEZONE -> CastType.OFFSET_TIMESTAMP;
328+
case JSON, JSON_ARRAY -> CastType.JSON;
329+
case SQLXML, XML_ARRAY -> CastType.XML;
330+
case NULL -> CastType.NULL;
331+
default -> CastType.OTHER;
332+
};
362333
}
363334

364335
/**

0 commit comments

Comments
 (0)