Skip to content

Commit 9d030f5

Browse files
committed
#103 - Problem with ArrayTypeDetailsImpl#getName
1 parent 9404a36 commit 9d030f5

File tree

3 files changed

+98
-25
lines changed

3 files changed

+98
-25
lines changed

hibernate-models/src/main/java/org/hibernate/models/internal/ArrayTypeDetailsImpl.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -43,29 +43,7 @@ public int getDimensions() {
4343

4444
@Override
4545
public String getName() {
46-
StringBuilder builder = new StringBuilder();
47-
48-
TypeDetails type = this;
49-
while ( type.getTypeKind() == Kind.ARRAY ) {
50-
int dimensions = type.asArrayType().getDimensions();
51-
while ( dimensions-- > 0 ) {
52-
builder.append( '[' );
53-
}
54-
type = type.asArrayType().getConstituentType();
55-
}
56-
57-
// here, `type` is an element type of the array, i.e., never array
58-
if ( type.getTypeKind() == Kind.PRIMITIVE ) {
59-
builder.append( type.asPrimitiveType().toCode() );
60-
}
61-
else {
62-
// This relies on name() representing the erased type name
63-
// For historical 1.x reasons, we follow the Java reflection format
64-
// instead of the Java descriptor format.
65-
builder.append( 'L' ).append( type.getName() ).append( ';' );
66-
}
67-
68-
return builder.toString();
46+
return arrayClassDetails.getName();
6947
}
7048

7149
@Override
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package org.hibernate.models;
2+
3+
import org.hibernate.models.internal.ArrayTypeDetailsImpl;
4+
import org.hibernate.models.internal.ClassTypeDetailsImpl;
5+
import org.hibernate.models.internal.jdk.JdkClassDetails;
6+
import org.hibernate.models.spi.ClassDetails;
7+
import org.hibernate.models.spi.SourceModelBuildingContext;
8+
import org.hibernate.models.spi.TypeDetails;
9+
10+
import org.junit.jupiter.api.Test;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
14+
/**
15+
* @author Steve Ebersole
16+
*/
17+
public class MultiDimensionalArrayTypeTests {
18+
19+
@Test
20+
void testIntegerArrays() {
21+
final SourceModelBuildingContext buildingContext = SourceModelTestHelper.createBuildingContext(
22+
(contributions, ctx) -> {
23+
final ClassDetails intDetails = new JdkClassDetails( Integer.class, ctx );
24+
final ClassDetails intArrayDetails = new JdkClassDetails( Integer[].class, ctx );
25+
final ClassDetails intIntArrayDetails = new JdkClassDetails( Integer[][].class, ctx );
26+
final ClassDetails intIntIntArrayDetails = new JdkClassDetails( Integer[][][].class, ctx );
27+
28+
contributions.registerClass( intDetails );
29+
contributions.registerClass( intArrayDetails );
30+
contributions.registerClass( intIntArrayDetails );
31+
contributions.registerClass( intIntIntArrayDetails );
32+
}
33+
);
34+
35+
final ClassDetails intDetails = buildingContext.getClassDetailsRegistry().getClassDetails( Integer[][][].class.getName() );
36+
final ClassTypeDetailsImpl intTypeDetails = new ClassTypeDetailsImpl( intDetails, TypeDetails.Kind.CLASS );
37+
38+
final ClassDetails intArrayDetails = buildingContext.getClassDetailsRegistry().getClassDetails( Integer[].class.getName() );
39+
final ArrayTypeDetailsImpl intArrayTypeDetails = new ArrayTypeDetailsImpl( intArrayDetails, intTypeDetails );
40+
41+
final ClassDetails intIntArrayDetails = buildingContext.getClassDetailsRegistry().getClassDetails( Integer[][].class.getName() );
42+
final ArrayTypeDetailsImpl intIntArrayTypeDetails = new ArrayTypeDetailsImpl( intIntArrayDetails, intArrayTypeDetails );
43+
44+
final ClassDetails intIntIntArrayDetails = buildingContext.getClassDetailsRegistry().getClassDetails( Integer[][][].class.getName() );
45+
final ArrayTypeDetailsImpl intIntIntArrayTypeDetails = new ArrayTypeDetailsImpl( intIntIntArrayDetails, intIntArrayTypeDetails );
46+
47+
assertThat( intIntIntArrayTypeDetails.getName() ).isEqualTo( "[[[Ljava.lang.Integer;" );
48+
}
49+
50+
@Test
51+
void testIntArrays() {
52+
final SourceModelBuildingContext buildingContext = SourceModelTestHelper.createBuildingContext(
53+
(contributions, ctx) -> {
54+
final ClassDetails intDetails = new JdkClassDetails( int.class, ctx );
55+
final ClassDetails intArrayDetails = new JdkClassDetails( int[].class, ctx );
56+
final ClassDetails intIntArrayDetails = new JdkClassDetails( int[][].class, ctx );
57+
final ClassDetails intIntIntArrayDetails = new JdkClassDetails( int[][][].class, ctx );
58+
59+
contributions.registerClass( intDetails );
60+
contributions.registerClass( intArrayDetails );
61+
contributions.registerClass( intIntArrayDetails );
62+
contributions.registerClass( intIntIntArrayDetails );
63+
}
64+
);
65+
66+
final ClassDetails intDetails = buildingContext.getClassDetailsRegistry().getClassDetails( int[][][].class.getName() );
67+
final ClassTypeDetailsImpl intTypeDetails = new ClassTypeDetailsImpl( intDetails, TypeDetails.Kind.CLASS );
68+
69+
final ClassDetails intArrayDetails = buildingContext.getClassDetailsRegistry().getClassDetails( int[].class.getName() );
70+
final ArrayTypeDetailsImpl intArrayTypeDetails = new ArrayTypeDetailsImpl( intArrayDetails, intTypeDetails );
71+
72+
final ClassDetails intIntArrayDetails = buildingContext.getClassDetailsRegistry().getClassDetails( int[][].class.getName() );
73+
final ArrayTypeDetailsImpl intIntArrayTypeDetails = new ArrayTypeDetailsImpl( intIntArrayDetails, intArrayTypeDetails );
74+
75+
final ClassDetails intIntIntArrayDetails = buildingContext.getClassDetailsRegistry().getClassDetails( int[][][].class.getName() );
76+
final ArrayTypeDetailsImpl intIntIntArrayTypeDetails = new ArrayTypeDetailsImpl( intIntIntArrayDetails, intIntArrayTypeDetails );
77+
78+
assertThat( intIntIntArrayTypeDetails.getName() ).isEqualTo( "[[[I" );
79+
}
80+
}

hibernate-models/src/test/java/org/hibernate/models/SourceModelTestHelper.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.hibernate.models.internal.util.CollectionHelper;
99
import org.hibernate.models.orm.JpaAnnotations;
1010
import org.hibernate.models.spi.ClassLoading;
11+
import org.hibernate.models.spi.RegistryPrimer;
1112
import org.hibernate.models.spi.SourceModelBuildingContext;
1213

1314
import static org.hibernate.models.internal.SimpleClassLoading.SIMPLE_CLASS_LOADING;
@@ -25,10 +26,24 @@ public static SourceModelBuildingContext createBuildingContext(Class<?>... model
2526
public static SourceModelBuildingContext createBuildingContext(
2627
ClassLoading classLoadingAccess,
2728
Class<?>... modelClasses) {
28-
final SourceModelBuildingContext ctx = new BasicModelBuildingContextImpl(
29+
return createBuildingContext(
2930
classLoadingAccess,
30-
(contributions, buildingContext1) -> JpaAnnotations.forEachAnnotation( contributions::registerAnnotation )
31+
(contributions, buildingContext) -> JpaAnnotations.forEachAnnotation( contributions::registerAnnotation ),
32+
modelClasses
3133
);
34+
}
35+
36+
public static SourceModelBuildingContext createBuildingContext(
37+
RegistryPrimer registryPrimer,
38+
Class<?>... modelClasses) {
39+
return createBuildingContext( SIMPLE_CLASS_LOADING, registryPrimer, modelClasses );
40+
}
41+
42+
public static SourceModelBuildingContext createBuildingContext(
43+
ClassLoading classLoadingAccess,
44+
RegistryPrimer registryPrimer,
45+
Class<?>... modelClasses) {
46+
final SourceModelBuildingContext ctx = new BasicModelBuildingContextImpl( classLoadingAccess, registryPrimer );
3247

3348
if ( CollectionHelper.isNotEmpty( modelClasses ) ) {
3449
for ( Class<?> modelClass : modelClasses ) {

0 commit comments

Comments
 (0)