X getNamedAnnotationUsage(
Class type,
String matchName,
- String attributeToMatch) {
+ String attributeToMatch,
+ SourceModelBuildingContext modelContext) {
return getNamedAnnotationUsage(
- getBuildingContext().getAnnotationDescriptorRegistry().getDescriptor( type ),
+ modelContext.getAnnotationDescriptorRegistry().getDescriptor( type ),
matchName,
- attributeToMatch
+ attributeToMatch,
+ modelContext
);
}
@Override
- default MutableAnnotationUsage replaceAnnotationUsage(
+ default P replaceAnnotationUsage(
AnnotationDescriptor repeatableType,
AnnotationDescriptor
containerType,
- SourceModelBuildingContext buildingContext) {
+ SourceModelBuildingContext modelContext) {
assert repeatableType.isRepeatable();
assert repeatableType.getRepeatableContainer() == containerType;
- final MutableAnnotationUsage
containerTypeUsage = containerType.createUsage( buildingContext );
+ final P containerTypeUsage = containerType.createUsage( modelContext );
// effectively overwrites any previous registrations
- getUsageMap().put( containerType.getAnnotationType(), containerTypeUsage );
+ //noinspection unchecked,rawtypes
+ ( (Map) getUsageMap() ).put( containerType.getAnnotationType(), containerTypeUsage );
// remove any entry for the repeatable/singular form
getUsageMap().remove( repeatableType.getAnnotationType() );
return containerTypeUsage;
}
+
+ @Override
+ default AnnotationDescriptor asAnnotationDescriptor() {
+ return null;
+ }
+
+ @Override
+ FieldDetails asFieldDetails();
+
+ @Override
+ MethodDetails asMethodDetails();
+
+ @Override
+ RecordComponentDetails asRecordComponentDetails();
+
+ @Override
+ MutableClassDetails asClassDetails();
+
+ @Override
+ MutableMemberDetails asMemberDetails();
}
diff --git a/src/main/java/org/hibernate/models/internal/AnnotationUsageHelper.java b/src/main/java/org/hibernate/models/internal/AnnotationUsageHelper.java
index dae0de2..346710b 100644
--- a/src/main/java/org/hibernate/models/internal/AnnotationUsageHelper.java
+++ b/src/main/java/org/hibernate/models/internal/AnnotationUsageHelper.java
@@ -7,113 +7,212 @@
package org.hibernate.models.internal;
import java.lang.annotation.Annotation;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.lang.reflect.Array;
import java.util.Map;
+import java.util.function.Consumer;
import org.hibernate.models.AnnotationAccessException;
+import org.hibernate.models.internal.jandex.JandexValueHelper;
import org.hibernate.models.internal.util.CollectionHelper;
import org.hibernate.models.spi.AnnotationDescriptor;
-import org.hibernate.models.spi.AnnotationUsage;
+import org.hibernate.models.spi.AttributeDescriptor;
+import org.hibernate.models.spi.SourceModelBuildingContext;
+import org.hibernate.models.spi.SourceModelContext;
+
+import org.jboss.jandex.AnnotationInstance;
/**
- * Helper for dealing with annotation wrappers -
- * - {@link AnnotationDescriptor}
- * - {@link AnnotationUsage}
- *
- *
* @see AnnotationHelper
*
* @author Steve Ebersole
*/
public class AnnotationUsageHelper {
- public static AnnotationUsage findUsage(
+ public static A findUsage(
AnnotationDescriptor type,
- Map,AnnotationUsage extends Annotation>> usageMap) {
+ Map,? extends Annotation> usageMap) {
//noinspection unchecked
- return (AnnotationUsage) usageMap.get( type.getAnnotationType() );
+ return (A) usageMap.get( type.getAnnotationType() );
}
/**
- * Get the {@link AnnotationUsage} from the {@code usageMap} for the given {@code type}
+ * Get the annotation usage from the {@code usageMap} for the given {@code type}
*/
- public static AnnotationUsage getUsage(
+ public static A getUsage(
+ Class type,
+ Map,? extends Annotation> usageMap,
+ SourceModelBuildingContext modelContext) {
+ return getUsage(
+ modelContext.getAnnotationDescriptorRegistry().getDescriptor( type ),
+ usageMap,
+ modelContext
+ );
+ }
+
+ public static A[] extractRepeatedValues(
+ C container,
+ AnnotationDescriptor containerDescriptor,
+ SourceModelBuildingContext modelContext) {
+ return extractRepeatedValues( container, containerDescriptor.getAttribute( "value" ), modelContext );
+ }
+
+ public static A[] extractRepeatedValues(
+ C container,
+ AttributeDescriptor valuesAttribute,
+ SourceModelBuildingContext modelContext) {
+ return valuesAttribute.getTypeDescriptor().createJdkValueExtractor( modelContext ).extractValue( container, valuesAttribute, modelContext );
+ }
+
+ public static A[] extractRepeatedValues(
+ AnnotationInstance container,
+ AnnotationDescriptor containerDescriptor,
+ SourceModelBuildingContext modelContext) {
+ final AttributeDescriptor valuesAttribute = containerDescriptor.getAttribute( "value" );
+ return extractRepeatedValues( container, valuesAttribute, modelContext );
+ }
+
+ public static A[] extractRepeatedValues(
+ AnnotationInstance container,
+ AttributeDescriptor valuesAttribute,
+ SourceModelBuildingContext modelContext) {
+ return JandexValueHelper.extractValue( container, valuesAttribute, modelContext );
+ }
+
+ /**
+ * Get the annotation usage from the {@code usageMap} for the given {@code type}
+ */
+ public static A getUsage(
AnnotationDescriptor type,
- Map,AnnotationUsage extends Annotation>> usageMap) {
- final AnnotationUsage found = findUsage( type, usageMap );
+ Map,? extends Annotation> usageMap,
+ SourceModelBuildingContext modelContext) {
+ final A found = findUsage( type, usageMap );
if ( found == null ) {
- final AnnotationDescriptor> repeatableContainer = type.getRepeatableContainer();
+ //noinspection unchecked
+ final AnnotationDescriptor repeatableContainer = (AnnotationDescriptor) type.getRepeatableContainer();
if ( repeatableContainer != null ) {
- final AnnotationUsage extends Annotation> containerUsage = findUsage( repeatableContainer, usageMap );
+ final C containerUsage = findUsage( repeatableContainer, usageMap );
if ( containerUsage != null ) {
- final List> nestedUsages = containerUsage.getAttributeValue( "value" );
- if ( CollectionHelper.isEmpty( nestedUsages ) ) {
+ final A[] repeatedValues = extractRepeatedValues( containerUsage, repeatableContainer, modelContext );
+ if ( CollectionHelper.isEmpty( repeatedValues ) ) {
return null;
}
- if ( nestedUsages.size() > 1 ) {
+ if ( repeatedValues.length > 1 ) {
throw new AnnotationAccessException( "Found more than one usage of " + type.getAnnotationType().getName() );
}
- return nestedUsages.get( 0 );
+ return repeatedValues[0];
}
}
}
return found;
}
- public static List> getRepeatedUsages(
+ public static void forEachRepeatedAnnotationUsages(
+ Class repeatableType,
+ Class containerType,
+ Consumer consumer,
+ Map, ? extends Annotation> usageMap,
+ SourceModelBuildingContext modelContext) {
+ //noinspection unchecked
+ final A repeatable = (A) usageMap.get( repeatableType );
+ if ( repeatable != null ) {
+ consumer.accept( repeatable );
+ }
+
+ //noinspection unchecked
+ final C container = (C) usageMap.get( containerType );
+ if ( container != null ) {
+ final AnnotationDescriptor containerDescriptor = modelContext.getAnnotationDescriptorRegistry().getDescriptor( containerType );
+ final AttributeDescriptor attribute = containerDescriptor.getAttribute( "value" );
+ final A[] repetitions = AnnotationHelper.extractValue( container, attribute );
+ CollectionHelper.forEach( repetitions, consumer );
+ }
+ }
+
+ public static void forEachRepeatedAnnotationUsages(
+ AnnotationDescriptor repeatableDescriptor,
+ Consumer consumer,
+ Map, ? extends Annotation> usageMap,
+ SourceModelBuildingContext modelContext) {
+ //noinspection unchecked
+ final A repeatable = (A) usageMap.get( repeatableDescriptor.getAnnotationType() );
+ if ( repeatable != null ) {
+ consumer.accept( repeatable );
+ }
+
+ final Class extends Annotation> containerType = repeatableDescriptor.getRepeatableContainer().getAnnotationType();
+ final Annotation container = usageMap.get( containerType );
+ if ( container != null ) {
+ final AnnotationDescriptor> containerDescriptor = modelContext.getAnnotationDescriptorRegistry().getDescriptor( containerType );
+ final AttributeDescriptor attribute = containerDescriptor.getAttribute( "value" );
+ final A[] repetitions = AnnotationHelper.extractValue( container, attribute );
+ CollectionHelper.forEach( repetitions, consumer );
+ }
+ }
+
+ public static A[] getRepeatedUsages(
AnnotationDescriptor type,
- Map, AnnotationUsage extends Annotation>> usageMap) {
+ Map, ? extends Annotation> usageMap,
+ SourceModelBuildingContext modelContext) {
// e.g. `@NamedQuery`
- final AnnotationUsage usage = findUsage( type, usageMap );
+ final A usage = findUsage( type, usageMap );
// e.g. `@NamedQueries`
- final AnnotationUsage> containerUsage = type.getRepeatableContainer() != null
+ final Annotation containerUsage = type.getRepeatableContainer() != null
? findUsage( type.getRepeatableContainer(), usageMap )
: null;
if ( containerUsage != null ) {
- final List> repetitions = containerUsage.getAttributeValue( "value" );
- if ( CollectionHelper.isNotEmpty( repetitions ) ) {
+ final AttributeDescriptor attribute = type.getRepeatableContainer().getAttribute( "value" );
+ final A[] repeatableValues = AnnotationHelper.extractValue( containerUsage, attribute );
+
+ if ( CollectionHelper.isNotEmpty( repeatableValues ) ) {
if ( usage != null ) {
- final ArrayList> combined = new ArrayList<>( repetitions );
+ //noinspection unchecked
+ final A[] combined = (A[]) Array.newInstance( type.getAnnotationType(), repeatableValues.length + 1 );
// prepend the singular usage
- combined.add( 0, usage );
+ combined[0] = usage;
+ System.arraycopy( repeatableValues, 0, combined, 1, repeatableValues.length );
return combined;
}
- return repetitions;
+ return repeatableValues;
}
}
if ( usage != null ) {
- return Collections.singletonList( usage );
+ //noinspection unchecked
+ final A[] singleton = (A[]) Array.newInstance( type.getAnnotationType(), 1 );
+ singleton[0] = usage;
+ return singleton;
}
- return Collections.emptyList();
+ //noinspection unchecked
+ return (A[]) Array.newInstance( type.getAnnotationType(), 0 );
}
- public static AnnotationUsage getNamedUsage(
- AnnotationDescriptor type,
+ public static A getNamedUsage(
+ AnnotationDescriptor descriptor,
String matchValue,
String attributeToMatch,
- Map, AnnotationUsage>> usageMap) {
- final AnnotationUsage> annotationUsage = usageMap.get( type.getAnnotationType() );
+ Map, ?> usageMap,
+ SourceModelBuildingContext modelContext) {
+ //noinspection unchecked
+ final A annotationUsage = (A) usageMap.get( descriptor.getAnnotationType() );
if ( annotationUsage != null ) {
- if ( nameMatches( annotationUsage, matchValue, attributeToMatch ) ) {
- //noinspection unchecked
- return (AnnotationUsage) annotationUsage;
+ if ( nameMatches( annotationUsage, descriptor, matchValue, attributeToMatch, modelContext ) ) {
+ return annotationUsage;
}
return null;
}
- final AnnotationDescriptor> containerType = type.getRepeatableContainer();
+ //noinspection unchecked
+ final AnnotationDescriptor containerType = (AnnotationDescriptor) descriptor.getRepeatableContainer();
if ( containerType != null ) {
- final AnnotationUsage> containerUsage = usageMap.get( containerType.getAnnotationType() );
+ //noinspection unchecked
+ final C containerUsage = (C) usageMap.get( containerType.getAnnotationType() );
if ( containerUsage != null ) {
- final List> repeatedUsages = containerUsage.getAttributeValue( "value" );
- for ( int i = 0; i < repeatedUsages.size(); i++ ) {
- final AnnotationUsage repeatedUsage = repeatedUsages.get( i );
- if ( nameMatches( repeatedUsage, matchValue, attributeToMatch ) ) {
+ final A[] repeatedUsages = extractRepeatedValues( containerUsage, containerType, modelContext );
+ for ( int i = 0; i < repeatedUsages.length; i++ ) {
+ final A repeatedUsage = repeatedUsages[i];
+ if ( nameMatches( repeatedUsage, descriptor, matchValue, attributeToMatch, modelContext ) ) {
return repeatedUsage;
}
}
@@ -123,9 +222,15 @@ public static AnnotationUsage getNamedUsage(
return null;
}
- private static boolean nameMatches(AnnotationUsage> annotationUsage, String matchValue, String attributeToMatch) {
- final String name = annotationUsage.getAttributeValue( attributeToMatch );
- return matchValue.equals( name );
+ private static boolean nameMatches(
+ A annotationUsage,
+ AnnotationDescriptor descriptor,
+ String matchValue,
+ String attributeToMatch,
+ SourceModelContext modelContext) {
+ final AttributeDescriptor attributeDescriptor = descriptor.getAttribute( attributeToMatch );
+ final String usageName = AnnotationHelper.extractValue( annotationUsage, attributeDescriptor );
+ return matchValue.equals( usageName );
}
diff --git a/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java b/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java
index 9eafb00..5502bce 100644
--- a/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java
+++ b/src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java
@@ -11,17 +11,19 @@
import java.util.List;
import org.hibernate.models.internal.jandex.ArrayValueExtractor;
-import org.hibernate.models.internal.jandex.ArrayValueWrapper;
-import org.hibernate.models.spi.AnnotationDescriptor;
+import org.hibernate.models.internal.jandex.ArrayValueConverter;
+import org.hibernate.models.internal.jdk.JdkArrayValueConverter;
+import org.hibernate.models.internal.jdk.JdkArrayValueExtractor;
+import org.hibernate.models.internal.jdk.JdkPassThruConverter;
+import org.hibernate.models.internal.jdk.JdkPassThruExtractor;
import org.hibernate.models.spi.AttributeDescriptor;
+import org.hibernate.models.spi.JdkValueConverter;
+import org.hibernate.models.spi.JdkValueExtractor;
import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.spi.SourceModelBuildingContext;
-import org.hibernate.models.spi.ValueExtractor;
+import org.hibernate.models.spi.JandexValueExtractor;
import org.hibernate.models.spi.ValueTypeDescriptor;
-import org.hibernate.models.spi.ValueWrapper;
-
-import org.jboss.jandex.AnnotationInstance;
-import org.jboss.jandex.AnnotationValue;
+import org.hibernate.models.spi.JandexValueConverter;
/**
* Descriptor for array values. These are modeled as an array in the
@@ -29,54 +31,46 @@
*
* @author Steve Ebersole
*/
-public class ArrayTypeDescriptor implements ValueTypeDescriptor> {
+public class ArrayTypeDescriptor implements ValueTypeDescriptor {
private final ValueTypeDescriptor elementTypeDescriptor;
- private final Class> componentType;
+ private final Class componentType;
+ private final Class arrayType;
- private ValueWrapper, AnnotationValue> jandexValueWrapper;
- private ValueExtractor> jandexValueExtractor;
+ private JandexValueConverter jandexValueConverter;
+ private JandexValueExtractor jandexValueExtractor;
- private ValueWrapper,Object[]> jdkValueWrapper;
- private ValueExtractor> jdkValueExtractor;
+ private JdkValueConverter jdkValueConverter;
+ private JdkValueExtractor jdkValueExtractor;
- public ArrayTypeDescriptor(ValueTypeDescriptor elementTypeDescriptor, Class> componentType) {
+ public ArrayTypeDescriptor(ValueTypeDescriptor elementTypeDescriptor) {
this.elementTypeDescriptor = elementTypeDescriptor;
- this.componentType = componentType;
+ this.componentType = elementTypeDescriptor.getValueType();
+ //noinspection unchecked
+ this.arrayType = (Class) componentType.arrayType();
}
- @Override
- public Class> getWrappedValueType() {
- //noinspection unchecked,rawtypes
- return (Class) List.class;
+ public ValueTypeDescriptor getElementTypeDescriptor() {
+ return elementTypeDescriptor;
}
@Override
- public List createValue(
- AttributeDescriptor> attributeDescriptor,
- SourceModelBuildingContext context) {
- final Object defaultValue = attributeDescriptor.getAttributeMethod().getDefaultValue();
- if ( defaultValue == null ) {
- // a non-defaulted attribute, just return null for the baseline
- return null;
- }
-
- final ValueWrapper, Object[]> jdkWrapper = createJdkWrapper( context );
- return jdkWrapper.wrap( (Object[]) defaultValue, context );
+ public Class getValueType() {
+ return arrayType;
}
@Override
- public AttributeDescriptor> createAttributeDescriptor(
- AnnotationDescriptor> annotationDescriptor,
+ public AttributeDescriptor createAttributeDescriptor(
+ Class extends Annotation> annotationType,
String attributeName) {
- return new AttributeDescriptorImpl<>( annotationDescriptor.getAnnotationType(), attributeName, this );
+ return new AttributeDescriptorImpl<>( annotationType, attributeName, this );
}
@Override
- public ValueExtractor> createJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor createJandexValueExtractor(SourceModelBuildingContext buildingContext) {
return resolveJandexExtractor( buildingContext );
}
- public ValueExtractor> resolveJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor resolveJandexExtractor(SourceModelBuildingContext buildingContext) {
if ( jandexValueExtractor == null ) {
this.jandexValueExtractor = new ArrayValueExtractor<>( resolveJandexWrapper( buildingContext ) );
}
@@ -84,75 +78,86 @@ public ValueExtractor> resolveJandexExtractor(Source
}
@Override
- public ValueWrapper, AnnotationValue> createJandexWrapper(SourceModelBuildingContext buildingContext) {
+ public JandexValueConverter createJandexValueConverter(SourceModelBuildingContext buildingContext) {
return resolveJandexWrapper( buildingContext );
}
- private ValueWrapper, AnnotationValue> resolveJandexWrapper(SourceModelBuildingContext buildingContext) {
- if ( jandexValueWrapper == null ) {
- final ValueWrapper jandexElementWrapper = elementTypeDescriptor.createJandexWrapper( buildingContext );
- jandexValueWrapper = new ArrayValueWrapper<>( jandexElementWrapper );
+ private JandexValueConverter resolveJandexWrapper(SourceModelBuildingContext buildingContext) {
+ if ( jandexValueConverter == null ) {
+ jandexValueConverter = new ArrayValueConverter<>( elementTypeDescriptor );
}
- return jandexValueWrapper;
+ return jandexValueConverter;
}
@Override
- public ValueExtractor> createJdkExtractor(SourceModelBuildingContext buildingContext) {
- return resolveJdkExtractor( buildingContext );
- }
-
- public ValueExtractor> resolveJdkExtractor(SourceModelBuildingContext buildingContext) {
- if ( jdkValueExtractor == null ) {
- this.jdkValueExtractor = new org.hibernate.models.internal.jdk.ArrayValueExtractor<>( resolveJkWrapper( buildingContext ) );
+ public JdkValueConverter createJdkValueConverter(SourceModelBuildingContext modelContext) {
+ if ( jdkValueConverter == null ) {
+ if ( !elementTypeDescriptor.getValueType().isAnnotation() ) {
+ // for arrays of anything other than nested annotations we can simply return the raw array
+ jdkValueConverter = JdkPassThruConverter.passThruConverter();
+ }
+ else {
+ jdkValueConverter = new JdkArrayValueConverter<>( elementTypeDescriptor );
+ }
}
- return jdkValueExtractor;
- }
- @Override
- public ValueWrapper,Object[]> createJdkWrapper(SourceModelBuildingContext buildingContext) {
- return resolveJkWrapper( buildingContext );
+ return jdkValueConverter;
}
- public ValueWrapper,Object[]> resolveJkWrapper(SourceModelBuildingContext buildingContext) {
- if ( jdkValueWrapper == null ) {
- //noinspection unchecked
- final ValueWrapper jdkElementWrapper = (ValueWrapper) elementTypeDescriptor.createJdkWrapper( buildingContext );
- jdkValueWrapper = new org.hibernate.models.internal.jdk.ArrayValueWrapper<>( jdkElementWrapper );
+ @Override
+ public JdkValueExtractor createJdkValueExtractor(SourceModelBuildingContext modelContext) {
+ if ( jdkValueExtractor == null ) {
+ if ( !elementTypeDescriptor.getValueType().isAnnotation() ) {
+ // for arrays of anything other than nested annotations we can simply return the raw array
+ jdkValueExtractor = JdkPassThruExtractor.passThruExtractor();
+ }
+ else {
+ jdkValueExtractor = new JdkArrayValueExtractor<>( createJdkValueConverter( modelContext ) );
+ }
}
- return jdkValueWrapper;
+ return jdkValueExtractor;
}
@Override
- public Object unwrap(List value) {
- final Object[] result = (Object[]) Array.newInstance( componentType, value.size() );
- for ( int i = 0; i < value.size(); i++ ) {
- result[i] = elementTypeDescriptor.unwrap( value.get( i ) );
+ public Object unwrap(V[] value) {
+ final Object[] result = (Object[]) Array.newInstance( componentType, value.length );
+ for ( int i = 0; i < value.length; i++ ) {
+ result[i] = elementTypeDescriptor.unwrap( value[i] );
}
return result;
}
@Override
- public void render(RenderingCollector collector, String name, Object attributeValue) {
+ public void render(RenderingCollector collector, String name, Object attributeValue, SourceModelBuildingContext modelContext) {
+ assert attributeValue != null : "Annotation value was null - " + name;
+
//noinspection unchecked
- final List values = (List) attributeValue;
+ final V[] values = (V[]) attributeValue;
collector.addLine( "%s = {", name );
collector.indent( 2 );
- values.forEach( (value) -> elementTypeDescriptor.render( collector, value ) );
+ for ( V value : values ) {
+ elementTypeDescriptor.render( collector, value, modelContext );
+ }
collector.unindent( 2 );
collector.addLine( "}" );
}
@Override
- public void render(RenderingCollector collector, Object attributeValue) {
+ public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
//noinspection unchecked
final List values = (List) attributeValue;
collector.addLine( "{" );
collector.indent( 2 );
- values.forEach( (value) -> elementTypeDescriptor.render( collector, value ) );
+ values.forEach( (value) -> elementTypeDescriptor.render( collector, value, modelContext ) );
collector.unindent( 2 );
collector.addLine( "}" );
}
+
+ @Override
+ public V[][] makeArray(int size, SourceModelBuildingContext modelContext) {
+ throw new UnsupportedOperationException( "Nested array creation not supported" );
+ }
}
diff --git a/src/main/java/org/hibernate/models/internal/AttributeDescriptorImpl.java b/src/main/java/org/hibernate/models/internal/AttributeDescriptorImpl.java
index e47d4e5..567bbc3 100644
--- a/src/main/java/org/hibernate/models/internal/AttributeDescriptorImpl.java
+++ b/src/main/java/org/hibernate/models/internal/AttributeDescriptorImpl.java
@@ -63,7 +63,7 @@ public String toString() {
Locale.ROOT,
"AttributeDescriptor(%s : %s)",
name,
- getTypeDescriptor().getWrappedValueType().getName()
+ getTypeDescriptor().getValueType().getName()
);
}
}
diff --git a/src/main/java/org/hibernate/models/internal/BooleanTypeDescriptor.java b/src/main/java/org/hibernate/models/internal/BooleanTypeDescriptor.java
index 8551b37..7fce1c0 100644
--- a/src/main/java/org/hibernate/models/internal/BooleanTypeDescriptor.java
+++ b/src/main/java/org/hibernate/models/internal/BooleanTypeDescriptor.java
@@ -6,19 +6,11 @@
*/
package org.hibernate.models.internal;
-import java.lang.annotation.Annotation;
-
+import org.hibernate.models.internal.jandex.BooleanValueConverter;
import org.hibernate.models.internal.jandex.BooleanValueExtractor;
-import org.hibernate.models.internal.jandex.BooleanValueWrapper;
-import org.hibernate.models.internal.jdk.PassThruExtractor;
import org.hibernate.models.spi.SourceModelBuildingContext;
-import org.hibernate.models.spi.ValueExtractor;
-import org.hibernate.models.spi.ValueWrapper;
-
-import org.jboss.jandex.AnnotationInstance;
-import org.jboss.jandex.AnnotationValue;
-
-import static org.hibernate.models.internal.jdk.PassThruWrapper.PASS_THRU_WRAPPER;
+import org.hibernate.models.spi.JandexValueConverter;
+import org.hibernate.models.spi.JandexValueExtractor;
/**
* Descriptor for boolean values
@@ -29,34 +21,27 @@ public class BooleanTypeDescriptor extends AbstractTypeDescriptor {
public static final BooleanTypeDescriptor BOOLEAN_TYPE_DESCRIPTOR = new BooleanTypeDescriptor();
@Override
- public Class getWrappedValueType() {
+ public Class getValueType() {
return Boolean.class;
}
@Override
- public ValueWrapper createJandexWrapper(SourceModelBuildingContext buildingContext) {
- return BooleanValueWrapper.JANDEX_BOOLEAN_VALUE_WRAPPER;
+ public JandexValueConverter createJandexValueConverter(SourceModelBuildingContext buildingContext) {
+ return BooleanValueConverter.JANDEX_BOOLEAN_VALUE_WRAPPER;
}
@Override
- public ValueExtractor createJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor createJandexValueExtractor(SourceModelBuildingContext buildingContext) {
return BooleanValueExtractor.JANDEX_BOOLEAN_EXTRACTOR;
}
@Override
- public ValueWrapper createJdkWrapper(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PASS_THRU_WRAPPER;
- }
-
- @Override
- public ValueExtractor createJdkExtractor(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PassThruExtractor.PASS_THRU_EXTRACTOR;
+ public Object unwrap(Boolean value) {
+ return value;
}
@Override
- public Object unwrap(Boolean value) {
- return value;
+ public Boolean[] makeArray(int size, SourceModelBuildingContext modelContext) {
+ return new Boolean[size];
}
}
diff --git a/src/main/java/org/hibernate/models/internal/ByteTypeDescriptor.java b/src/main/java/org/hibernate/models/internal/ByteTypeDescriptor.java
index 9cb673f..fec1d6f 100644
--- a/src/main/java/org/hibernate/models/internal/ByteTypeDescriptor.java
+++ b/src/main/java/org/hibernate/models/internal/ByteTypeDescriptor.java
@@ -6,19 +6,11 @@
*/
package org.hibernate.models.internal;
-import java.lang.annotation.Annotation;
-
+import org.hibernate.models.internal.jandex.ByteValueConverter;
import org.hibernate.models.internal.jandex.ByteValueExtractor;
-import org.hibernate.models.internal.jandex.ByteValueWrapper;
-import org.hibernate.models.internal.jdk.PassThruExtractor;
+import org.hibernate.models.spi.JandexValueConverter;
+import org.hibernate.models.spi.JandexValueExtractor;
import org.hibernate.models.spi.SourceModelBuildingContext;
-import org.hibernate.models.spi.ValueExtractor;
-import org.hibernate.models.spi.ValueWrapper;
-
-import org.jboss.jandex.AnnotationInstance;
-import org.jboss.jandex.AnnotationValue;
-
-import static org.hibernate.models.internal.jdk.PassThruWrapper.PASS_THRU_WRAPPER;
/**
* Descriptor for byte values
@@ -29,34 +21,27 @@ public class ByteTypeDescriptor extends AbstractTypeDescriptor {
public static final ByteTypeDescriptor BYTE_TYPE_DESCRIPTOR = new ByteTypeDescriptor();
@Override
- public Class getWrappedValueType() {
+ public Class getValueType() {
return Byte.class;
}
@Override
- public ValueWrapper createJandexWrapper(SourceModelBuildingContext buildingContext) {
- return ByteValueWrapper.JANDEX_BYTE_VALUE_WRAPPER;
+ public JandexValueConverter createJandexValueConverter(SourceModelBuildingContext buildingContext) {
+ return ByteValueConverter.JANDEX_BYTE_VALUE_WRAPPER;
}
@Override
- public ValueExtractor createJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor createJandexValueExtractor(SourceModelBuildingContext buildingContext) {
return ByteValueExtractor.JANDEX_BYTE_EXTRACTOR;
}
@Override
- public ValueWrapper createJdkWrapper(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PASS_THRU_WRAPPER;
- }
-
- @Override
- public ValueExtractor createJdkExtractor(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PassThruExtractor.PASS_THRU_EXTRACTOR;
+ public Object unwrap(Byte value) {
+ return value;
}
@Override
- public Object unwrap(Byte value) {
- return value;
+ public Byte[] makeArray(int size, SourceModelBuildingContext modelContext) {
+ return new Byte[size];
}
}
diff --git a/src/main/java/org/hibernate/models/internal/CharacterTypeDescriptor.java b/src/main/java/org/hibernate/models/internal/CharacterTypeDescriptor.java
index 54c003d..b9e5b0c 100644
--- a/src/main/java/org/hibernate/models/internal/CharacterTypeDescriptor.java
+++ b/src/main/java/org/hibernate/models/internal/CharacterTypeDescriptor.java
@@ -6,19 +6,11 @@
*/
package org.hibernate.models.internal;
-import java.lang.annotation.Annotation;
-
+import org.hibernate.models.internal.jandex.CharacterValueConverter;
import org.hibernate.models.internal.jandex.CharacterValueExtractor;
-import org.hibernate.models.internal.jandex.CharacterValueWrapper;
-import org.hibernate.models.internal.jdk.PassThruExtractor;
+import org.hibernate.models.spi.JandexValueConverter;
+import org.hibernate.models.spi.JandexValueExtractor;
import org.hibernate.models.spi.SourceModelBuildingContext;
-import org.hibernate.models.spi.ValueExtractor;
-import org.hibernate.models.spi.ValueWrapper;
-
-import org.jboss.jandex.AnnotationInstance;
-import org.jboss.jandex.AnnotationValue;
-
-import static org.hibernate.models.internal.jdk.PassThruWrapper.PASS_THRU_WRAPPER;
/**
* Descriptor for char values
@@ -29,34 +21,27 @@ public class CharacterTypeDescriptor extends AbstractTypeDescriptor {
public static final CharacterTypeDescriptor CHARACTER_TYPE_DESCRIPTOR = new CharacterTypeDescriptor();
@Override
- public Class getWrappedValueType() {
+ public Class getValueType() {
return Character.class;
}
@Override
- public ValueWrapper createJandexWrapper(SourceModelBuildingContext buildingContext) {
- return CharacterValueWrapper.JANDEX_CHARACTER_VALUE_WRAPPER;
+ public JandexValueConverter createJandexValueConverter(SourceModelBuildingContext buildingContext) {
+ return CharacterValueConverter.JANDEX_CHARACTER_VALUE_WRAPPER;
}
@Override
- public ValueExtractor createJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor createJandexValueExtractor(SourceModelBuildingContext buildingContext) {
return CharacterValueExtractor.JANDEX_CHARACTER_EXTRACTOR;
}
@Override
- public ValueWrapper createJdkWrapper(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PASS_THRU_WRAPPER;
- }
-
- @Override
- public ValueExtractor createJdkExtractor(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PassThruExtractor.PASS_THRU_EXTRACTOR;
+ public Object unwrap(Character value) {
+ return value;
}
@Override
- public Object unwrap(Character value) {
- return value;
+ public Character[] makeArray(int size, SourceModelBuildingContext modelContext) {
+ return new Character[size];
}
}
diff --git a/src/main/java/org/hibernate/models/internal/ClassDetailsSupport.java b/src/main/java/org/hibernate/models/internal/ClassDetailsSupport.java
index 8fbaebd..337c48a 100644
--- a/src/main/java/org/hibernate/models/internal/ClassDetailsSupport.java
+++ b/src/main/java/org/hibernate/models/internal/ClassDetailsSupport.java
@@ -9,13 +9,15 @@
import java.lang.annotation.Annotation;
import java.util.List;
-import org.hibernate.models.internal.util.CollectionHelper;
+import org.hibernate.models.IllegalCastException;
import org.hibernate.models.internal.util.IndexedConsumer;
import org.hibernate.models.spi.AnnotationDescriptor;
-import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.models.spi.MutableClassDetails;
+import org.hibernate.models.spi.MutableMemberDetails;
+import org.hibernate.models.spi.RecordComponentDetails;
+import org.hibernate.models.spi.SourceModelBuildingContext;
/**
* @author Steve Ebersole
@@ -47,44 +49,56 @@ default void forEachMethod(IndexedConsumer consumer) {
}
@Override
- default AnnotationUsage getAnnotationUsage(AnnotationDescriptor type) {
- final AnnotationUsage localUsage = AnnotationUsageHelper.getUsage( type, getUsageMap() );
+ default A getAnnotationUsage(
+ AnnotationDescriptor descriptor,
+ SourceModelBuildingContext modelContext) {
+ final A localUsage = AnnotationUsageHelper.getUsage( descriptor, getUsageMap(),modelContext );
if ( localUsage != null ) {
return localUsage;
}
- if ( type.isInherited() && getSuperClass() != null ) {
- return getSuperClass().getAnnotationUsage( type );
+ if ( descriptor.isInherited() && getSuperClass() != null ) {
+ return getSuperClass().getAnnotationUsage( descriptor, modelContext );
}
return null;
}
@Override
- default List> getRepeatedAnnotationUsages(AnnotationDescriptor type) {
- final List> localUsages = AnnotationTargetSupport.super.getRepeatedAnnotationUsages( type );
+ default A getAnnotationUsage(Class annotationType, SourceModelBuildingContext modelContext) {
+ return getAnnotationUsage(
+ modelContext.getAnnotationDescriptorRegistry().getDescriptor( annotationType ),
+ modelContext
+ );
+ }
- if ( type.isInherited() && getSuperClass() != null ) {
- final List> inheritedUsages = getSuperClass().getRepeatedAnnotationUsages( type );
- return CollectionHelper.join( localUsages, inheritedUsages );
- }
+ @Override
+ default MutableClassDetails asClassDetails() {
+ return this;
+ }
- return localUsages;
+ @Override
+ default AnnotationDescriptor asAnnotationDescriptor() {
+ throw new IllegalCastException( "ClassDetails cannot be cast as AnnotationDescriptor" );
}
@Override
- default AnnotationUsage getNamedAnnotationUsage(
- AnnotationDescriptor type,
- String matchValue,
- String attributeToMatch) {
- final AnnotationUsage localUsage = AnnotationTargetSupport.super.getNamedAnnotationUsage( type, matchValue, attributeToMatch );
- if ( localUsage != null ) {
- return localUsage;
- }
+ default MutableMemberDetails asMemberDetails() {
+ throw new IllegalCastException( "ClassDetails cannot be cast as MemberDetails" );
+ }
- if ( type.isInherited() && getSuperClass() != null ) {
- return getSuperClass().getNamedAnnotationUsage( type, matchValue, attributeToMatch );
- }
- return null;
+ @Override
+ default FieldDetails asFieldDetails() {
+ throw new IllegalCastException( "ClassDetails cannot be cast as FieldDetails" );
+ }
+
+ @Override
+ default MethodDetails asMethodDetails() {
+ throw new IllegalCastException( "ClassDetails cannot be cast as MethodDetails" );
+ }
+
+ @Override
+ default RecordComponentDetails asRecordComponentDetails() {
+ throw new IllegalCastException( "ClassDetails cannot be cast as RecordComponentDetails" );
}
}
diff --git a/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java b/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java
index 6a7d9f5..cd060eb 100644
--- a/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java
+++ b/src/main/java/org/hibernate/models/internal/ClassTypeDescriptor.java
@@ -6,64 +6,58 @@
*/
package org.hibernate.models.internal;
-import java.lang.annotation.Annotation;
-
+import org.hibernate.models.internal.jandex.ClassValueConverter;
import org.hibernate.models.internal.jandex.ClassValueExtractor;
-import org.hibernate.models.internal.jandex.ClassValueWrapper;
-import org.hibernate.models.spi.ClassDetails;
+import org.hibernate.models.spi.JandexValueConverter;
+import org.hibernate.models.spi.JandexValueExtractor;
import org.hibernate.models.spi.RenderingCollector;
import org.hibernate.models.spi.SourceModelBuildingContext;
-import org.hibernate.models.spi.ValueExtractor;
-import org.hibernate.models.spi.ValueWrapper;
-
-import org.jboss.jandex.AnnotationInstance;
-import org.jboss.jandex.AnnotationValue;
/**
* Descriptor for class values
*
* @author Steve Ebersole
*/
-public class ClassTypeDescriptor extends AbstractTypeDescriptor {
+public class ClassTypeDescriptor extends AbstractTypeDescriptor> {
public static final ClassTypeDescriptor CLASS_TYPE_DESCRIPTOR = new ClassTypeDescriptor();
@Override
- public Class getWrappedValueType() {
- return ClassDetails.class;
+ public Class> getValueType() {
+ //noinspection unchecked,rawtypes
+ return (Class) Class.class;
}
@Override
- public ValueWrapper createJandexWrapper(SourceModelBuildingContext buildingContext) {
- return ClassValueWrapper.JANDEX_CLASS_VALUE_WRAPPER;
+ public JandexValueConverter> createJandexValueConverter(SourceModelBuildingContext buildingContext) {
+ return ClassValueConverter.JANDEX_CLASS_VALUE_WRAPPER;
}
@Override
- public ValueExtractor createJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor> createJandexValueExtractor(SourceModelBuildingContext buildingContext) {
return ClassValueExtractor.JANDEX_CLASS_EXTRACTOR;
}
@Override
- public ValueWrapper createJdkWrapper(SourceModelBuildingContext buildingContext) {
- return org.hibernate.models.internal.jdk.ClassValueWrapper.JDK_CLASS_VALUE_WRAPPER;
- }
-
- @Override
- public ValueExtractor createJdkExtractor(SourceModelBuildingContext buildingContext) {
- return org.hibernate.models.internal.jdk.ClassValueExtractor.JDK_CLASS_EXTRACTOR;
+ public Object unwrap(Class> value) {
+ return value;
}
@Override
- public Object unwrap(ClassDetails value) {
- return value.toJavaClass();
+ public void render(
+ RenderingCollector collector,
+ String name,
+ Object attributeValue,
+ SourceModelBuildingContext modelContext) {
+ super.render( collector, name, ( (Class>) attributeValue ).getName(), modelContext );
}
@Override
- public void render(RenderingCollector collector, String name, Object attributeValue) {
- super.render( collector, name, ( (ClassDetails) attributeValue ).getName() );
+ public void render(RenderingCollector collector, Object attributeValue, SourceModelBuildingContext modelContext) {
+ super.render( collector, ( (Class>) attributeValue ).getName(), modelContext );
}
@Override
- public void render(RenderingCollector collector, Object attributeValue) {
- super.render( collector, ( (ClassDetails) attributeValue ).getName() );
+ public Class>[] makeArray(int size, SourceModelBuildingContext modelContext) {
+ return new Class>[size];
}
}
diff --git a/src/main/java/org/hibernate/models/internal/DoubleTypeDescriptor.java b/src/main/java/org/hibernate/models/internal/DoubleTypeDescriptor.java
index 546652b..59a9ea4 100644
--- a/src/main/java/org/hibernate/models/internal/DoubleTypeDescriptor.java
+++ b/src/main/java/org/hibernate/models/internal/DoubleTypeDescriptor.java
@@ -6,19 +6,11 @@
*/
package org.hibernate.models.internal;
-import java.lang.annotation.Annotation;
-
+import org.hibernate.models.internal.jandex.DoubleValueConverter;
import org.hibernate.models.internal.jandex.DoubleValueExtractor;
-import org.hibernate.models.internal.jandex.DoubleValueWrapper;
-import org.hibernate.models.internal.jdk.PassThruExtractor;
+import org.hibernate.models.spi.JandexValueConverter;
+import org.hibernate.models.spi.JandexValueExtractor;
import org.hibernate.models.spi.SourceModelBuildingContext;
-import org.hibernate.models.spi.ValueExtractor;
-import org.hibernate.models.spi.ValueWrapper;
-
-import org.jboss.jandex.AnnotationInstance;
-import org.jboss.jandex.AnnotationValue;
-
-import static org.hibernate.models.internal.jdk.PassThruWrapper.PASS_THRU_WRAPPER;
/**
* Descriptor for double values
@@ -29,34 +21,27 @@ public class DoubleTypeDescriptor extends AbstractTypeDescriptor {
public static final DoubleTypeDescriptor DOUBLE_TYPE_DESCRIPTOR = new DoubleTypeDescriptor();
@Override
- public Class getWrappedValueType() {
+ public Class getValueType() {
return Double.class;
}
@Override
- public ValueWrapper createJandexWrapper(SourceModelBuildingContext buildingContext) {
- return DoubleValueWrapper.JANDEX_DOUBLE_VALUE_WRAPPER;
+ public JandexValueConverter createJandexValueConverter(SourceModelBuildingContext modelContext) {
+ return DoubleValueConverter.JANDEX_DOUBLE_VALUE_WRAPPER;
}
@Override
- public ValueExtractor createJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor createJandexValueExtractor(SourceModelBuildingContext modelContext) {
return DoubleValueExtractor.JANDEX_DOUBLE_EXTRACTOR;
}
@Override
- public ValueWrapper createJdkWrapper(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PASS_THRU_WRAPPER;
- }
-
- @Override
- public ValueExtractor createJdkExtractor(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PassThruExtractor.PASS_THRU_EXTRACTOR;
+ public Object unwrap(Double value) {
+ return value;
}
@Override
- public Object unwrap(Double value) {
- return value;
+ public Double[] makeArray(int size, SourceModelBuildingContext modelContext) {
+ return new Double[size];
}
}
diff --git a/src/main/java/org/hibernate/models/internal/EnumTypeDescriptor.java b/src/main/java/org/hibernate/models/internal/EnumTypeDescriptor.java
index 7e19d03..d1bac6f 100644
--- a/src/main/java/org/hibernate/models/internal/EnumTypeDescriptor.java
+++ b/src/main/java/org/hibernate/models/internal/EnumTypeDescriptor.java
@@ -6,19 +6,13 @@
*/
package org.hibernate.models.internal;
-import java.lang.annotation.Annotation;
+import java.lang.reflect.Array;
+import org.hibernate.models.internal.jandex.EnumValueConverter;
import org.hibernate.models.internal.jandex.EnumValueExtractor;
-import org.hibernate.models.internal.jandex.EnumValueWrapper;
-import org.hibernate.models.internal.jdk.PassThruExtractor;
import org.hibernate.models.spi.SourceModelBuildingContext;
-import org.hibernate.models.spi.ValueExtractor;
-import org.hibernate.models.spi.ValueWrapper;
-
-import org.jboss.jandex.AnnotationInstance;
-import org.jboss.jandex.AnnotationValue;
-
-import static org.hibernate.models.internal.jdk.PassThruWrapper.PASS_THRU_WRAPPER;
+import org.hibernate.models.spi.JandexValueConverter;
+import org.hibernate.models.spi.JandexValueExtractor;
/**
* Descriptor for enum values
@@ -28,44 +22,38 @@
public class EnumTypeDescriptor> extends AbstractTypeDescriptor {
private final Class enumType;
- private final EnumValueWrapper jandexWrapper;
+ private final EnumValueConverter jandexWrapper;
private final EnumValueExtractor jandexExtractor;
public EnumTypeDescriptor(Class enumType) {
this.enumType = enumType;
- this.jandexWrapper = new EnumValueWrapper<>( enumType );
+ this.jandexWrapper = new EnumValueConverter<>( enumType );
this.jandexExtractor = new EnumValueExtractor<>( jandexWrapper );
}
@Override
- public Class getWrappedValueType() {
+ public Class getValueType() {
return enumType;
}
@Override
- public ValueWrapper createJandexWrapper(SourceModelBuildingContext buildingContext) {
+ public JandexValueConverter createJandexValueConverter(SourceModelBuildingContext modelContext) {
return jandexWrapper;
}
@Override
- public ValueExtractor createJandexExtractor(SourceModelBuildingContext buildingContext) {
+ public JandexValueExtractor createJandexValueExtractor(SourceModelBuildingContext modelContext) {
return jandexExtractor;
}
@Override
- public ValueWrapper createJdkWrapper(SourceModelBuildingContext buildingContext) {
- //noinspection unchecked
- return PASS_THRU_WRAPPER;
+ public Object unwrap(E value) {
+ return value;
}
@Override
- public ValueExtractor