Skip to content

Commit ce6d4f7

Browse files
mbelladesebersole
authored andcommitted
Cleanup dynamic annotation baseline values extraction using ValueTypeDescriptor.createValue
Also, make array type descriptor and wrappers return mutable lists
1 parent 04b5648 commit ce6d4f7

File tree

5 files changed

+27
-85
lines changed

5 files changed

+27
-85
lines changed

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,14 @@ public Class<List<V>> getWrappedValueType() {
5555
public List<V> createValue(
5656
AttributeDescriptor<?> attributeDescriptor,
5757
SourceModelBuildingContext context) {
58-
final Object[] defaultValue = (Object[]) attributeDescriptor.getAttributeMethod().getDefaultValue();
59-
if ( CollectionHelper.isEmpty( defaultValue ) ) {
60-
return Collections.emptyList();
58+
final Object defaultValue = attributeDescriptor.getAttributeMethod().getDefaultValue();
59+
if ( defaultValue == null ) {
60+
// a non-defaulted attribute, just return null for the baseline
61+
return null;
6162
}
6263

63-
return jdkValueWrapper.wrap( defaultValue, context );
64+
final ValueWrapper<List<V>, Object[]> jdkWrapper = createJdkWrapper( context );
65+
return jdkWrapper.wrap( (Object[]) defaultValue, context );
6466
}
6567

6668
@Override

src/main/java/org/hibernate/models/internal/dynamic/DynamicAnnotationUsage.java

Lines changed: 4 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,15 @@
77
package org.hibernate.models.internal.dynamic;
88

99
import java.lang.annotation.Annotation;
10-
import java.lang.reflect.InvocationTargetException;
11-
import java.util.ArrayList;
1210
import java.util.HashMap;
13-
import java.util.List;
1411
import java.util.Locale;
1512
import java.util.Map;
1613

17-
import org.hibernate.models.AnnotationAccessException;
1814
import org.hibernate.models.internal.AnnotationProxy;
1915
import org.hibernate.models.spi.AnnotationDescriptor;
2016
import org.hibernate.models.spi.AttributeDescriptor;
2117
import org.hibernate.models.spi.MutableAnnotationUsage;
22-
import org.hibernate.models.spi.SourceModelContext;
18+
import org.hibernate.models.spi.SourceModelBuildingContext;
2319

2420
/**
2521
* AnnotationUsage built dynamically (for dynamic models, XML mappings, etc.)
@@ -31,7 +27,7 @@ public class DynamicAnnotationUsage<A extends Annotation> implements MutableAnno
3127

3228
private Map<String, Object> values;
3329

34-
public DynamicAnnotationUsage( AnnotationDescriptor<A> annotationDescriptor, SourceModelContext context) {
30+
public DynamicAnnotationUsage( AnnotationDescriptor<A> annotationDescriptor, SourceModelBuildingContext context) {
3531
this( annotationDescriptor, extractBaselineValues( annotationDescriptor, context ) );
3632
}
3733

@@ -96,59 +92,14 @@ public <V> V setAttributeValue(String name, V value) {
9692

9793
private static <A extends Annotation> Map<String, Object> extractBaselineValues(
9894
AnnotationDescriptor<A> annotationDescriptor,
99-
SourceModelContext context) {
95+
SourceModelBuildingContext context) {
10096
final HashMap<String, Object> values = new HashMap<>();
10197
for ( AttributeDescriptor<?> attribute : annotationDescriptor.getAttributes() ) {
10298
values.put(
10399
attribute.getName(),
104-
extractDefaultValue( attribute.getAttributeMethod().getDefaultValue(), context )
100+
attribute.getTypeDescriptor().createValue( attribute, context )
105101
);
106102
}
107103
return values;
108104
}
109-
110-
private static Object extractDefaultValue(Object value, SourceModelContext context) {
111-
if ( value != null ) {
112-
if ( value.getClass().isArray() ) {
113-
return extractList( value, context );
114-
}
115-
else if ( value instanceof Class<?> clazz ) {
116-
return context.getClassDetailsRegistry().resolveClassDetails( clazz.getName() );
117-
}
118-
else if ( value instanceof Annotation annotation ) {
119-
try {
120-
return extractAnnotation( annotation, context );
121-
}
122-
catch (InvocationTargetException | IllegalAccessException e) {
123-
throw new AnnotationAccessException( "Error accessing default annotation-typed attribute", e );
124-
}
125-
}
126-
}
127-
return value;
128-
}
129-
130-
private static <E> List<Object> extractList(Object value, SourceModelContext context) {
131-
final List<Object> result = new ArrayList<>();
132-
//noinspection unchecked
133-
final E[] array = (E[]) value;
134-
for ( E element : array ) {
135-
result.add( extractDefaultValue( element, context ) );
136-
}
137-
return result;
138-
}
139-
140-
private static DynamicAnnotationUsage<?> extractAnnotation(Annotation annotation, SourceModelContext context)
141-
throws InvocationTargetException, IllegalAccessException {
142-
final Class<? extends Annotation> annotationType = annotation.annotationType();
143-
final AnnotationDescriptor<?> descriptor = context.getAnnotationDescriptorRegistry()
144-
.getDescriptor( annotationType );
145-
final Map<String, Object> values = new HashMap<>();
146-
for ( AttributeDescriptor<?> attribute : descriptor.getAttributes() ) {
147-
values.put(
148-
attribute.getName(),
149-
extractDefaultValue( attribute.getAttributeMethod().invoke( annotation ), context )
150-
);
151-
}
152-
return new DynamicAnnotationUsage<>( descriptor, values );
153-
}
154105
}

src/main/java/org/hibernate/models/internal/jandex/ArrayValueWrapper.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.ArrayList;
1010
import java.util.Collections;
1111
import java.util.List;
12+
import java.util.stream.Collectors;
1213

1314
import org.hibernate.models.spi.SourceModelBuildingContext;
1415
import org.hibernate.models.spi.ValueWrapper;
@@ -32,18 +33,10 @@ public List<V> wrap(AnnotationValue rawValue, SourceModelBuildingContext buildin
3233
final List<AnnotationValue> values = rawValue.asArrayList();
3334
assert values != null;
3435

35-
if ( values.isEmpty() ) {
36-
return Collections.emptyList();
36+
final List<V> result = new ArrayList<>( values.size() );
37+
for ( final AnnotationValue value : values ) {
38+
result.add( elementWrapper.wrap( value, buildingContext ) );
3739
}
38-
39-
if ( values.size() == 1 ) {
40-
return Collections.singletonList( elementWrapper.wrap( values.get(0), buildingContext ) );
41-
}
42-
43-
final List<V> results = new ArrayList<>( values.size() );
44-
values.forEach( (value) -> {
45-
results.add( elementWrapper.wrap( value, buildingContext ) );
46-
} );
47-
return results;
40+
return result;
4841
}
4942
}

src/main/java/org/hibernate/models/internal/jdk/ArrayValueWrapper.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,9 @@ public ArrayValueWrapper(ValueWrapper<V, R> elementWrapper) {
2626

2727
@Override
2828
public List<V> wrap(R[] rawValues, SourceModelBuildingContext buildingContext) {
29-
if ( CollectionHelper.isEmpty( rawValues ) ) {
30-
return Collections.emptyList();
31-
}
32-
33-
if ( rawValues.length == 1 ) {
34-
return Collections.singletonList( elementWrapper.wrap( rawValues[0], buildingContext ) );
35-
}
36-
3729
final List<V> result = new ArrayList<>( rawValues.length );
38-
for ( int i = 0; i < rawValues.length; i++ ) {
39-
result.add( elementWrapper.wrap( rawValues[i], buildingContext ) );
30+
for ( final R rawValue : rawValues ) {
31+
result.add( elementWrapper.wrap( rawValue, buildingContext ) );
4032
}
4133
return result;
4234
}

src/test/java/org/hibernate/models/dynamic/DynamicAnnotationTests.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@
1414
import org.hibernate.models.internal.dynamic.DynamicAnnotationUsage;
1515
import org.hibernate.models.internal.dynamic.DynamicClassDetails;
1616
import org.hibernate.models.orm.JpaAnnotations;
17+
import org.hibernate.models.spi.AnnotationUsage;
1718
import org.hibernate.models.spi.ClassDetails;
19+
import org.hibernate.models.spi.MutableAnnotationUsage;
1820

1921
import org.junit.jupiter.api.Test;
2022

2123
import jakarta.persistence.ConstraintMode;
2224
import jakarta.persistence.ElementCollection;
25+
import jakarta.persistence.ForeignKey;
2326
import jakarta.persistence.GeneratedValue;
2427
import jakarta.persistence.GenerationType;
2528
import jakarta.persistence.JoinTable;
@@ -69,15 +72,16 @@ void testJoinTableForeignKeyDefaultValue() {
6972

7073
final Object foreignKey = generatorAnn.getAttributeValue( "foreignKey" );
7174

72-
assertThat( foreignKey ).isInstanceOf( DynamicAnnotationUsage.class );
75+
assertThat( foreignKey ).isInstanceOf( AnnotationUsage.class );
7376

74-
final DynamicAnnotationUsage foreignKeyAnnotationUsage = (DynamicAnnotationUsage) foreignKey;
77+
//noinspection unchecked
78+
final AnnotationUsage<ForeignKey> foreignKeyAnnotationUsage = (AnnotationUsage<ForeignKey>) foreignKey;
7579

76-
assertThat( foreignKeyAnnotationUsage.getAttributeValue( "value" ) ).isEqualTo( ConstraintMode.PROVIDER_DEFAULT );
80+
assertThat( foreignKeyAnnotationUsage.<ConstraintMode>getAttributeValue( "value" ) ).isEqualTo( ConstraintMode.PROVIDER_DEFAULT );
7781

78-
assertThat( foreignKeyAnnotationUsage.getAttributeValue( "name" )).isEqualTo( "" );
79-
assertThat( foreignKeyAnnotationUsage.getAttributeValue( "options" )).isEqualTo( "" );
80-
assertThat( foreignKeyAnnotationUsage.getAttributeValue( "foreignKeyDefinition" )).isEqualTo( "" );
82+
assertThat( foreignKeyAnnotationUsage.<String>getAttributeValue( "name" ) ).isEqualTo( "" );
83+
assertThat( foreignKeyAnnotationUsage.<String>getAttributeValue( "options" ) ).isEqualTo( "" );
84+
assertThat( foreignKeyAnnotationUsage.<String>getAttributeValue( "foreignKeyDefinition" ) ).isEqualTo( "" );
8185
}
8286

8387
@Test

0 commit comments

Comments
 (0)