Skip to content

Commit 3b0d043

Browse files
committed
minor code cleanups in ArrayJavaType and ArrayJdbcType
1 parent c2a271d commit 3b0d043

File tree

2 files changed

+73
-83
lines changed

2 files changed

+73
-83
lines changed

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

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package org.hibernate.type.descriptor.java;
66

77
import java.io.Serializable;
8-
import java.lang.reflect.Array;
98
import java.sql.SQLException;
109
import java.util.Collection;
1110

@@ -24,6 +23,7 @@
2423
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
2524
import org.hibernate.type.spi.TypeConfiguration;
2625

26+
import static java.lang.reflect.Array.newInstance;
2727
import static org.hibernate.internal.util.ReflectHelper.arrayClass;
2828

2929
/**
@@ -242,7 +242,7 @@ else if ( c == '\\' && i + 2 < len && (charSequence.charAt( i + 1 ) == '\\' || c
242242
sb.append( c );
243243
}
244244
//noinspection unchecked
245-
final T[] result = (T[]) Array.newInstance( getElementJavaType().getJavaTypeClass(), lst.size() );
245+
final T[] result = (T[]) newInstance( getElementJavaType().getJavaTypeClass(), lst.size() );
246246
for ( int i = 0; i < result.length; i ++ ) {
247247
if ( lst.get( i ) != null ) {
248248
result[i] = getElementJavaType().fromString( lst.get( i ) );
@@ -270,7 +270,7 @@ else if ( type == BinaryStream.class ) {
270270
}
271271
else if ( type.isArray() ) {
272272
final Class<?> preferredJavaTypeClass = type.getComponentType();
273-
final Object[] unwrapped = (Object[]) Array.newInstance( preferredJavaTypeClass, value.length );
273+
final Object[] unwrapped = (Object[]) newInstance( preferredJavaTypeClass, value.length );
274274
for ( int i = 0; i < value.length; i++ ) {
275275
unwrapped[i] = getElementJavaType().unwrap( value[i], preferredJavaTypeClass, options );
276276
}
@@ -298,10 +298,11 @@ public <X> T[] wrap(X value, WrapperOptions options) {
298298
}
299299
}
300300

301+
final JavaType<T> elementJavaType = getElementJavaType();
301302
if ( value instanceof Object[] raw ) {
302-
final Class<T> componentClass = getElementJavaType().getJavaTypeClass();
303+
final Class<T> componentClass = elementJavaType.getJavaTypeClass();
303304
//noinspection unchecked
304-
final T[] wrapped = (T[]) java.lang.reflect.Array.newInstance( componentClass, raw.length );
305+
final T[] wrapped = (T[]) newInstance( componentClass, raw.length );
305306
if ( componentClass.isAssignableFrom( value.getClass().getComponentType() ) ) {
306307
for (int i = 0; i < raw.length; i++) {
307308
//noinspection unchecked
@@ -310,7 +311,7 @@ public <X> T[] wrap(X value, WrapperOptions options) {
310311
}
311312
else {
312313
for ( int i = 0; i < raw.length; i++ ) {
313-
wrapped[i] = getElementJavaType().wrap( raw[i], options );
314+
wrapped[i] = elementJavaType.wrap( raw[i], options );
314315
}
315316
}
316317
return wrapped;
@@ -322,50 +323,52 @@ else if ( value instanceof BinaryStream binaryStream ) {
322323
// When the value is a BinaryStream, this is a deserialization request
323324
return fromBytes( binaryStream.getBytes() );
324325
}
325-
else if ( getElementJavaType().isInstance( value ) ) {
326+
else if ( elementJavaType.isInstance( value ) ) {
326327
// Support binding a single element as parameter value
327328
//noinspection unchecked
328-
final T[] wrapped = (T[]) java.lang.reflect.Array.newInstance( getElementJavaType().getJavaTypeClass(), 1 );
329+
final T[] wrapped = (T[]) newInstance( elementJavaType.getJavaTypeClass(), 1 );
329330
//noinspection unchecked
330331
wrapped[0] = (T) value;
331332
return wrapped;
332333
}
333334
else if ( value instanceof Collection<?> collection ) {
334335
//noinspection unchecked
335-
final T[] wrapped = (T[]) java.lang.reflect.Array.newInstance( getElementJavaType().getJavaTypeClass(), collection.size() );
336+
final T[] wrapped = (T[]) newInstance( elementJavaType.getJavaTypeClass(), collection.size() );
336337
int i = 0;
337338
for ( Object e : collection ) {
338-
wrapped[i++] = getElementJavaType().wrap( e, options );
339+
wrapped[i++] = elementJavaType.wrap( e, options );
339340
}
340341
return wrapped;
341342
}
342343

343344
throw unknownWrap( value.getClass() );
344345
}
345346

346-
private static <T> byte[] toBytes(T[] value) {
347-
if ( value.getClass().getComponentType().isEnum() ) {
348-
final byte[] array = new byte[value.length];
349-
for (int i = 0; i < value.length; i++ ) {
347+
private static <T> byte[] toBytes(T[] array) {
348+
if ( array.getClass().getComponentType().isEnum() ) {
349+
final byte[] bytes = new byte[array.length];
350+
for (int i = 0; i < array.length; i++ ) {
351+
final T value = array[i];
350352
// encode null enum value as -1
351-
array[i] = value[i] == null ? -1 : (byte) ((Enum<?>) value[i]).ordinal();
353+
bytes[i] = value == null ? -1 : (byte) ((Enum<?>) value).ordinal();
352354
}
353-
return array;
355+
return bytes;
354356

355357
}
356358
else {
357359
// byte[] can only be requested if the value should be serialized
358-
return SerializationHelper.serialize( value );
360+
return SerializationHelper.serialize( array );
359361
}
360362
}
361363

362364
private T[] fromBytes(byte[] bytes) {
363365
final Class<T> elementClass = getElementJavaType().getJavaTypeClass();
364366
if ( elementClass.isEnum() ) {
365-
final Object[] array = (Object[]) Array.newInstance( elementClass, bytes.length );
367+
final T[] enumConstants = elementClass.getEnumConstants();
368+
final Object[] array = (Object[]) newInstance( elementClass, bytes.length );
366369
for (int i = 0; i < bytes.length; i++ ) {
367370
// null enum value was encoded as -1
368-
array[i] = bytes[i] == -1 ? null : elementClass.getEnumConstants()[bytes[i]];
371+
array[i] = bytes[i] == -1 ? null : enumConstants[bytes[i]];
369372
}
370373
//noinspection unchecked
371374
return (T[]) array;
@@ -400,7 +403,7 @@ public T[] deepCopy(T[] value) {
400403
return null;
401404
}
402405
//noinspection unchecked
403-
final T[] copy = (T[]) Array.newInstance( componentClass, value.length );
406+
final T[] copy = (T[]) newInstance( componentClass, value.length );
404407
for ( int i = 0; i < value.length; i ++ ) {
405408
copy[ i ] = componentPlan.deepCopy( value[ i ] );
406409
}

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

Lines changed: 50 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.hibernate.type.internal.ParameterizedTypeImpl;
3232
import org.hibernate.type.spi.TypeConfiguration;
3333

34+
import static java.lang.reflect.Array.newInstance;
3435
import static org.hibernate.type.descriptor.jdbc.StructHelper.instantiate;
3536

3637
/**
@@ -62,44 +63,41 @@ public <T> JavaType<T> getJdbcRecommendedJavaTypeMapping(
6263
Integer precision,
6364
Integer scale,
6465
TypeConfiguration typeConfiguration) {
65-
final JavaType<Object> elementJavaType = elementJdbcType.getJdbcRecommendedJavaTypeMapping(
66-
precision,
67-
scale,
68-
typeConfiguration
69-
);
70-
final JavaType<Object> javaType = typeConfiguration.getJavaTypeRegistry().resolveDescriptor(
71-
Array.newInstance( elementJavaType.getJavaTypeClass(), 0 ).getClass()
72-
);
66+
final JavaType<?> elementJavaType =
67+
elementJdbcType.getJdbcRecommendedJavaTypeMapping( precision, scale, typeConfiguration );
68+
final JavaType<?> javaType =
69+
typeConfiguration.getJavaTypeRegistry()
70+
.resolveDescriptor( newInstance( elementJavaType.getJavaTypeClass(), 0 ).getClass() );
7371
if ( javaType instanceof BasicPluralType<?, ?> ) {
7472
//noinspection unchecked
7573
return (JavaType<T>) javaType;
7674
}
77-
//noinspection unchecked
78-
return (JavaType<T>) javaType.createJavaType(
79-
new ParameterizedTypeImpl( javaType.getJavaTypeClass(), new Type[0], null ),
80-
typeConfiguration
81-
);
75+
else {
76+
//noinspection unchecked
77+
return (JavaType<T>) javaType.createJavaType(
78+
new ParameterizedTypeImpl( javaType.getJavaTypeClass(), new Type[0], null ),
79+
typeConfiguration
80+
);
81+
}
8282
}
8383

84-
@Override
85-
public <T> JdbcLiteralFormatter<T> getJdbcLiteralFormatter(JavaType<T> javaTypeDescriptor) {
86-
final JavaType<T> elementJavaType;
84+
private static JavaType<?> elementJavaType(JavaType<?> javaTypeDescriptor) {
8785
if ( javaTypeDescriptor instanceof ByteArrayJavaType ) {
8886
// Special handling needed for Byte[], because that would conflict with the VARBINARY mapping
89-
//noinspection unchecked
90-
elementJavaType = (JavaType<T>) ByteJavaType.INSTANCE;
87+
return ByteJavaType.INSTANCE;
9188
}
92-
else if ( javaTypeDescriptor instanceof BasicPluralJavaType ) {
93-
//noinspection unchecked
94-
elementJavaType = ((BasicPluralJavaType<T>) javaTypeDescriptor).getElementJavaType();
89+
else if ( javaTypeDescriptor instanceof BasicPluralJavaType<?> basicPluralJavaType ) {
90+
return basicPluralJavaType.getElementJavaType();
9591
}
9692
else {
9793
throw new IllegalArgumentException("not a BasicPluralJavaType");
9894
}
99-
return new JdbcLiteralFormatterArray<>(
100-
javaTypeDescriptor,
101-
elementJdbcType.getJdbcLiteralFormatter( elementJavaType )
102-
);
95+
}
96+
97+
@Override
98+
public <T> JdbcLiteralFormatter<T> getJdbcLiteralFormatter(JavaType<T> javaTypeDescriptor) {
99+
return new JdbcLiteralFormatterArray<>( javaTypeDescriptor,
100+
elementJdbcType.getJdbcLiteralFormatter( elementJavaType( javaTypeDescriptor ) ) );
103101
}
104102

105103
@Override
@@ -113,30 +111,18 @@ protected String getElementTypeName(JavaType<?> javaType, SharedSessionContractI
113111
if ( elementJdbcType instanceof StructuredJdbcType structJdbcType ) {
114112
return structJdbcType.getStructTypeName();
115113
}
116-
final JavaType<?> elementJavaType;
117-
if ( javaType instanceof ByteArrayJavaType ) {
118-
// Special handling needed for Byte[], because that would conflict with the VARBINARY mapping
119-
elementJavaType = ByteJavaType.INSTANCE;
120-
}
121-
else {
122-
elementJavaType = ( (BasicPluralJavaType<?>) javaType ).getElementJavaType();
123-
}
124-
final Size size = session.getJdbcServices()
125-
.getDialect()
126-
.getSizeStrategy()
127-
.resolveSize( elementJdbcType, elementJavaType, null, null, null );
114+
final JavaType<?> elementJavaType = elementJavaType( javaType );
115+
final Size size =
116+
session.getJdbcServices().getDialect().getSizeStrategy()
117+
.resolveSize( elementJdbcType, elementJavaType, null, null, null );
128118
final DdlTypeRegistry ddlTypeRegistry = session.getTypeConfiguration().getDdlTypeRegistry();
129-
final String typeName = ddlTypeRegistry.getDescriptor( elementJdbcType.getDdlTypeCode() )
130-
.getTypeName( size, new BasicTypeImpl<>( elementJavaType, elementJdbcType), ddlTypeRegistry );
131-
int cutIndex = typeName.indexOf( '(' );
132-
if ( cutIndex > 0 ) {
133-
// getTypeName for this case required length, etc, parameters.
134-
// Cut them out and use database defaults.
135-
return typeName.substring( 0, cutIndex );
136-
}
137-
else {
138-
return typeName;
139-
}
119+
final String typeName =
120+
ddlTypeRegistry.getDescriptor( elementJdbcType.getDdlTypeCode() )
121+
.getTypeName( size, new BasicTypeImpl<>( elementJavaType, elementJdbcType), ddlTypeRegistry );
122+
// getTypeName for this case required length, etc, parameters.
123+
// Cut them out and use database defaults.
124+
final int cutIndex = typeName.indexOf( '(' );
125+
return cutIndex > 0 ? typeName.substring( 0, cutIndex ) : typeName;
140126
}
141127

142128
protected <T> Object[] getArray(BasicBinder<?> binder, ValueBinder<T> elementBinder, T value, WrapperOptions options)
@@ -157,20 +143,23 @@ protected <T> Object[] getArray(BasicBinder<?> binder, ValueBinder<T> elementBin
157143
else {
158144
final TypeConfiguration typeConfiguration = options.getTypeConfiguration();
159145
final JdbcType underlyingJdbcType =
160-
typeConfiguration.getJdbcTypeRegistry().getDescriptor( elementJdbcType.getDefaultSqlTypeCode() );
146+
typeConfiguration.getJdbcTypeRegistry()
147+
.getDescriptor( elementJdbcType.getDefaultSqlTypeCode() );
161148
final Class<?> preferredJavaTypeClass = elementJdbcType.getPreferredJavaTypeClass( options );
162149
final Class<?> elementJdbcJavaTypeClass =
163150
preferredJavaTypeClass == null
164151
? underlyingJdbcType.getJdbcRecommendedJavaTypeMapping(null, null, typeConfiguration )
165152
.getJavaTypeClass()
166153
: preferredJavaTypeClass;
167-
final Class<? extends Object[]> arrayClass = (Class<? extends Object[]>)
168-
Array.newInstance( elementJdbcJavaTypeClass, 0 ).getClass();
154+
final var arrayClass = (Class<? extends Object[]>)
155+
newInstance( elementJdbcJavaTypeClass, 0 ).getClass();
169156
return javaType.unwrap( value, arrayClass, options );
170157
}
171158
}
172159

173-
protected <X> X getArray(BasicExtractor<X> extractor, java.sql.Array array, WrapperOptions options) throws SQLException {
160+
protected <X> X getArray(BasicExtractor<X> extractor, java.sql.Array array, WrapperOptions options)
161+
throws SQLException {
162+
final JavaType<X> javaType = extractor.getJavaType();
174163
if ( array != null && getElementJdbcType() instanceof AggregateJdbcType aggregateJdbcType ) {
175164
final EmbeddableMappingType embeddableMappingType = aggregateJdbcType.getEmbeddableMappingType();
176165
final Object rawArray = array.getArray();
@@ -187,10 +176,10 @@ protected <X> X getArray(BasicExtractor<X> extractor, java.sql.Array array, Wrap
187176
domainObjects[i] = instantiate( embeddableMappingType, attributeValues );
188177
}
189178
}
190-
return extractor.getJavaType().wrap( domainObjects, options );
179+
return javaType.wrap( domainObjects, options );
191180
}
192181
else {
193-
return extractor.getJavaType().wrap( array, options );
182+
return javaType.wrap( array, options );
194183
}
195184
}
196185

@@ -209,9 +198,9 @@ protected void doBind(PreparedStatement st, X value, int index, WrapperOptions o
209198
@Override
210199
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
211200
throws SQLException {
212-
final java.sql.Array arr = getArray( value, options );
201+
final java.sql.Array array = getArray( value, options );
213202
try {
214-
st.setObject( name, arr, java.sql.Types.ARRAY );
203+
st.setObject( name, array, java.sql.Types.ARRAY );
215204
}
216205
catch (SQLException ex) {
217206
throw new HibernateException( "JDBC driver does not support named parameters for setArray. Use positional.", ex );
@@ -266,16 +255,14 @@ public String toString() {
266255
}
267256

268257
/**
269-
* Check equality. Needed so that ArrayJdbcType in collections correctly match each other.
270-
*
271-
* @param o other object
258+
* Check equality. Needed so that {@code ArrayJdbcType} in collections correctly match each other.
272259
* @return true if the two array types share the same element type
273260
*/
274261
@Override
275-
public boolean equals(Object o) {
276-
return o != null
277-
&& getClass() == o.getClass()
278-
&& getElementJdbcType().equals( ( (ArrayJdbcType) o ).getElementJdbcType() );
262+
public boolean equals(Object that) {
263+
return that instanceof ArrayJdbcType arrayJdbcType
264+
&& this.getClass() == that.getClass()
265+
&& getElementJdbcType().equals( arrayJdbcType.getElementJdbcType() );
279266
}
280267

281268
@Override

0 commit comments

Comments
 (0)