Skip to content

Commit 0c9041d

Browse files
dreab8sebersole
authored andcommitted
Fix cast exception when unwrapping ArrayTypeDescrptor which component type is an Annotationusage
1 parent a805073 commit 0c9041d

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.hibernate.models.internal;
88

99
import java.lang.annotation.Annotation;
10+
import java.lang.reflect.Array;
1011
import java.util.Collections;
1112
import java.util.List;
1213

@@ -32,15 +33,17 @@
3233
*/
3334
public class ArrayTypeDescriptor<V> implements ValueTypeDescriptor<List<V>> {
3435
private final ValueTypeDescriptor<V> elementTypeDescriptor;
36+
private final Class<?> componentType;
3537

3638
private ValueWrapper<List<V>, AnnotationValue> jandexValueWrapper;
3739
private ValueExtractor<AnnotationInstance,List<V>> jandexValueExtractor;
3840

3941
private ValueWrapper<List<V>,Object[]> jdkValueWrapper;
4042
private ValueExtractor<Annotation,List<V>> jdkValueExtractor;
4143

42-
public ArrayTypeDescriptor(ValueTypeDescriptor<V> elementTypeDescriptor) {
44+
public ArrayTypeDescriptor(ValueTypeDescriptor<V> elementTypeDescriptor, Class<?> componentType) {
4345
this.elementTypeDescriptor = elementTypeDescriptor;
46+
this.componentType = componentType;
4447
}
4548

4649
@Override
@@ -123,9 +126,9 @@ public ValueWrapper<List<V>,Object[]> resolveJkWrapper(SourceModelBuildingContex
123126

124127
@Override
125128
public Object unwrap(List<V> value) {
126-
final Object[] result = new Object[value.size()];
129+
final Object[] result = (Object[]) Array.newInstance( componentType, value.size() );
127130
for ( int i = 0; i < value.size(); i++ ) {
128-
result[i] = elementTypeDescriptor.unwrap( value.get(i) );
131+
result[i] = elementTypeDescriptor.unwrap( value.get( i ) );
129132
}
130133
return result;
131134
}

src/main/java/org/hibernate/models/internal/TypeDescriptors.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public static <T,W> ValueTypeDescriptor<W> resolveTypeDescriptor(Class<T> attrib
7474
if ( attributeType.isArray() ) {
7575
final Class<?> componentType = attributeType.getComponentType();
7676
final ValueTypeDescriptor<?> elementTypeDescriptor = resolveTypeDescriptor( componentType );
77-
return (ValueTypeDescriptor<W>) new ArrayTypeDescriptor<>( elementTypeDescriptor );
77+
return (ValueTypeDescriptor<W>) new ArrayTypeDescriptor<>( elementTypeDescriptor, componentType );
7878
}
7979

8080
if ( attributeType.isEnum() ) {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.hibernate.models.dynamic;
2+
3+
import org.hibernate.models.internal.SourceModelBuildingContextImpl;
4+
import org.hibernate.models.internal.dynamic.DynamicAnnotationUsage;
5+
import org.hibernate.models.internal.dynamic.DynamicClassDetails;
6+
import org.hibernate.models.orm.JpaAnnotations;
7+
8+
import org.junit.jupiter.api.Test;
9+
10+
import jakarta.persistence.JoinTable;
11+
12+
import static org.hibernate.models.SourceModelTestHelper.createBuildingContext;
13+
14+
public class ToAnnotationTest {
15+
16+
@Test
17+
void testAccessArrayOfAnnotations() {
18+
final SourceModelBuildingContextImpl buildingContext = createBuildingContext();
19+
final DynamicClassDetails dynamicEntity = new DynamicClassDetails( "DynamicEntity", buildingContext );
20+
final DynamicAnnotationUsage<JoinTable> generatorAnn = new DynamicAnnotationUsage<>(
21+
JpaAnnotations.JOIN_TABLE,
22+
dynamicEntity,
23+
buildingContext
24+
);
25+
26+
JoinTable joinTableAnn = generatorAnn.toAnnotation();
27+
28+
joinTableAnn.indexes();
29+
}
30+
}

0 commit comments

Comments
 (0)