split out FilterDefBinder
This commit is contained in:
parent
95ee026cb2
commit
76d7d4c3a8
|
@ -6,10 +6,8 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.boot.model.internal;
|
package org.hibernate.boot.model.internal;
|
||||||
|
|
||||||
import java.lang.reflect.ParameterizedType;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.AnnotationException;
|
import org.hibernate.AnnotationException;
|
||||||
|
@ -26,8 +24,6 @@ import org.hibernate.annotations.FetchMode;
|
||||||
import org.hibernate.annotations.FetchProfile;
|
import org.hibernate.annotations.FetchProfile;
|
||||||
import org.hibernate.annotations.FetchProfile.FetchOverride;
|
import org.hibernate.annotations.FetchProfile.FetchOverride;
|
||||||
import org.hibernate.annotations.FetchProfiles;
|
import org.hibernate.annotations.FetchProfiles;
|
||||||
import org.hibernate.annotations.FilterDef;
|
|
||||||
import org.hibernate.annotations.FilterDefs;
|
|
||||||
import org.hibernate.annotations.GenericGenerator;
|
import org.hibernate.annotations.GenericGenerator;
|
||||||
import org.hibernate.annotations.GenericGenerators;
|
import org.hibernate.annotations.GenericGenerators;
|
||||||
import org.hibernate.annotations.Imported;
|
import org.hibernate.annotations.Imported;
|
||||||
|
@ -35,7 +31,6 @@ import org.hibernate.annotations.JavaTypeRegistration;
|
||||||
import org.hibernate.annotations.JavaTypeRegistrations;
|
import org.hibernate.annotations.JavaTypeRegistrations;
|
||||||
import org.hibernate.annotations.JdbcTypeRegistration;
|
import org.hibernate.annotations.JdbcTypeRegistration;
|
||||||
import org.hibernate.annotations.JdbcTypeRegistrations;
|
import org.hibernate.annotations.JdbcTypeRegistrations;
|
||||||
import org.hibernate.annotations.ParamDef;
|
|
||||||
import org.hibernate.annotations.TypeRegistration;
|
import org.hibernate.annotations.TypeRegistration;
|
||||||
import org.hibernate.annotations.TypeRegistrations;
|
import org.hibernate.annotations.TypeRegistrations;
|
||||||
import org.hibernate.annotations.common.reflection.ReflectionManager;
|
import org.hibernate.annotations.common.reflection.ReflectionManager;
|
||||||
|
@ -43,33 +38,16 @@ import org.hibernate.annotations.common.reflection.XAnnotatedElement;
|
||||||
import org.hibernate.annotations.common.reflection.XClass;
|
import org.hibernate.annotations.common.reflection.XClass;
|
||||||
import org.hibernate.annotations.common.reflection.XPackage;
|
import org.hibernate.annotations.common.reflection.XPackage;
|
||||||
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
|
import org.hibernate.boot.model.IdentifierGeneratorDefinition;
|
||||||
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
|
|
||||||
import org.hibernate.boot.model.convert.spi.RegisteredConversion;
|
import org.hibernate.boot.model.convert.spi.RegisteredConversion;
|
||||||
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
||||||
import org.hibernate.boot.spi.BootstrapContext;
|
|
||||||
import org.hibernate.boot.spi.MetadataBuildingContext;
|
import org.hibernate.boot.spi.MetadataBuildingContext;
|
||||||
import org.hibernate.dialect.Dialect;
|
|
||||||
import org.hibernate.engine.spi.FilterDefinition;
|
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
import org.hibernate.internal.util.GenericsHelper;
|
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
import org.hibernate.metamodel.mapping.JdbcMapping;
|
|
||||||
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
|
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
|
||||||
import org.hibernate.resource.beans.spi.ManagedBean;
|
|
||||||
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
import org.hibernate.type.BasicType;
|
|
||||||
import org.hibernate.type.CustomType;
|
|
||||||
import org.hibernate.type.descriptor.converter.internal.JpaAttributeConverterImpl;
|
|
||||||
import org.hibernate.type.descriptor.java.BasicJavaType;
|
import org.hibernate.type.descriptor.java.BasicJavaType;
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
|
||||||
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
|
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
|
|
||||||
import org.hibernate.type.internal.ConvertedBasicTypeImpl;
|
|
||||||
import org.hibernate.type.spi.TypeConfiguration;
|
|
||||||
import org.hibernate.usertype.UserType;
|
|
||||||
|
|
||||||
import jakarta.persistence.AttributeConverter;
|
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.FetchType;
|
import jakarta.persistence.FetchType;
|
||||||
import jakarta.persistence.Inheritance;
|
import jakarta.persistence.Inheritance;
|
||||||
|
@ -89,9 +67,8 @@ import jakarta.persistence.Table;
|
||||||
import jakarta.persistence.TableGenerator;
|
import jakarta.persistence.TableGenerator;
|
||||||
import jakarta.persistence.TableGenerators;
|
import jakarta.persistence.TableGenerators;
|
||||||
|
|
||||||
import static java.util.Collections.emptyMap;
|
|
||||||
import static org.hibernate.boot.model.internal.AnnotatedClassType.ENTITY;
|
import static org.hibernate.boot.model.internal.AnnotatedClassType.ENTITY;
|
||||||
import static org.hibernate.boot.model.internal.BinderHelper.getOverridableAnnotation;
|
import static org.hibernate.boot.model.internal.FilterDefBinder.bindFilterDefs;
|
||||||
import static org.hibernate.boot.model.internal.GeneratorBinder.buildGenerators;
|
import static org.hibernate.boot.model.internal.GeneratorBinder.buildGenerators;
|
||||||
import static org.hibernate.boot.model.internal.InheritanceState.getInheritanceStateOfSuperEntity;
|
import static org.hibernate.boot.model.internal.InheritanceState.getInheritanceStateOfSuperEntity;
|
||||||
import static org.hibernate.boot.model.internal.InheritanceState.getSuperclassInheritanceState;
|
import static org.hibernate.boot.model.internal.InheritanceState.getSuperclassInheritanceState;
|
||||||
|
@ -639,184 +616,6 @@ public final class AnnotationBinder {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void bindFilterDefs(XAnnotatedElement annotatedElement, MetadataBuildingContext context) {
|
|
||||||
final FilterDef filterDef = annotatedElement.getAnnotation( FilterDef.class );
|
|
||||||
final FilterDefs filterDefs = getOverridableAnnotation( annotatedElement, FilterDefs.class, context );
|
|
||||||
if ( filterDef != null ) {
|
|
||||||
bindFilterDef( filterDef, context );
|
|
||||||
}
|
|
||||||
if ( filterDefs != null ) {
|
|
||||||
for ( FilterDef def : filterDefs.value() ) {
|
|
||||||
bindFilterDef( def, context );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void bindFilterDef(FilterDef filterDef, MetadataBuildingContext context) {
|
|
||||||
final String name = filterDef.name();
|
|
||||||
if ( context.getMetadataCollector().getFilterDefinition( name ) != null ) {
|
|
||||||
throw new AnnotationException( "Multiple '@FilterDef' annotations define a filter named '" + name + "'" );
|
|
||||||
}
|
|
||||||
final Map<String, JdbcMapping> explicitParamJaMappings;
|
|
||||||
if ( filterDef.parameters().length == 0 ) {
|
|
||||||
explicitParamJaMappings = emptyMap();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
explicitParamJaMappings = new HashMap<>();
|
|
||||||
for ( ParamDef paramDef : filterDef.parameters() ) {
|
|
||||||
final JdbcMapping jdbcMapping = resolveFilterParamType( paramDef.type(), context );
|
|
||||||
if ( jdbcMapping == null ) {
|
|
||||||
throw new MappingException(
|
|
||||||
String.format(
|
|
||||||
Locale.ROOT,
|
|
||||||
"Unable to resolve type specified for parameter (%s) defined for @FilterDef (%s)",
|
|
||||||
paramDef.name(),
|
|
||||||
name
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
explicitParamJaMappings.put( paramDef.name(), jdbcMapping );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
final FilterDefinition filterDefinition =
|
|
||||||
new FilterDefinition( name, filterDef.defaultCondition(), explicitParamJaMappings );
|
|
||||||
LOG.debugf( "Binding filter definition: %s", filterDefinition.getFilterName() );
|
|
||||||
context.getMetadataCollector().addFilterDefinition( filterDefinition );
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private static JdbcMapping resolveFilterParamType(Class<?> type, MetadataBuildingContext context) {
|
|
||||||
if ( UserType.class.isAssignableFrom( type ) ) {
|
|
||||||
return resolveUserType( (Class<UserType<?>>) type, context );
|
|
||||||
}
|
|
||||||
else if ( AttributeConverter.class.isAssignableFrom( type ) ) {
|
|
||||||
return resolveAttributeConverter( (Class<AttributeConverter<?,?>>) type, context );
|
|
||||||
}
|
|
||||||
else if ( JavaType.class.isAssignableFrom( type ) ) {
|
|
||||||
return resolveJavaType( (Class<JavaType<?>>) type, context );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return resolveBasicType( type, context );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static BasicType<Object> resolveBasicType(Class<?> type, MetadataBuildingContext context) {
|
|
||||||
final TypeConfiguration typeConfiguration = context.getBootstrapContext().getTypeConfiguration();
|
|
||||||
final JavaType<Object> jtd = typeConfiguration.getJavaTypeRegistry().findDescriptor( type );
|
|
||||||
if ( jtd != null ) {
|
|
||||||
final JdbcType jdbcType = jtd.getRecommendedJdbcType(
|
|
||||||
new JdbcTypeIndicators() {
|
|
||||||
@Override
|
|
||||||
public TypeConfiguration getTypeConfiguration() {
|
|
||||||
return typeConfiguration;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPreferredSqlTypeCodeForBoolean() {
|
|
||||||
return context.getPreferredSqlTypeCodeForBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPreferredSqlTypeCodeForDuration() {
|
|
||||||
return context.getPreferredSqlTypeCodeForDuration();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPreferredSqlTypeCodeForUuid() {
|
|
||||||
return context.getPreferredSqlTypeCodeForUuid();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPreferredSqlTypeCodeForInstant() {
|
|
||||||
return context.getPreferredSqlTypeCodeForInstant();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPreferredSqlTypeCodeForArray() {
|
|
||||||
return context.getPreferredSqlTypeCodeForArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Dialect getDialect() {
|
|
||||||
return context.getMetadataCollector().getDatabase().getDialect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return typeConfiguration.getBasicTypeRegistry().resolve( jtd, jdbcType );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static JdbcMapping resolveUserType(Class<UserType<?>> userTypeClass, MetadataBuildingContext context) {
|
|
||||||
final UserType<?> userType = !context.getBuildingOptions().isAllowExtensionsInCdi()
|
|
||||||
? FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( userTypeClass )
|
|
||||||
: context.getBootstrapContext().getServiceRegistry()
|
|
||||||
.requireService( ManagedBeanRegistry.class )
|
|
||||||
.getBean( userTypeClass ).getBeanInstance();
|
|
||||||
return new CustomType<>( userType, context.getBootstrapContext().getTypeConfiguration() );
|
|
||||||
}
|
|
||||||
|
|
||||||
private static JdbcMapping resolveAttributeConverter(Class<AttributeConverter<?, ?>> type, MetadataBuildingContext context) {
|
|
||||||
final BootstrapContext bootstrapContext = context.getBootstrapContext();
|
|
||||||
final ManagedBeanRegistry beanRegistry =
|
|
||||||
bootstrapContext.getServiceRegistry().requireService( ManagedBeanRegistry.class );
|
|
||||||
final ManagedBean<AttributeConverter<?, ?>> bean = beanRegistry.getBean( type );
|
|
||||||
|
|
||||||
final TypeConfiguration typeConfiguration = bootstrapContext.getTypeConfiguration();
|
|
||||||
final JavaTypeRegistry jtdRegistry = typeConfiguration.getJavaTypeRegistry();
|
|
||||||
final JavaType<? extends AttributeConverter<?,?>> converterJtd = jtdRegistry.resolveDescriptor( bean.getBeanClass() );
|
|
||||||
|
|
||||||
final ParameterizedType converterParameterizedType = GenericsHelper.extractParameterizedType( bean.getBeanClass() );
|
|
||||||
final Class<?> domainJavaClass = GenericsHelper.extractClass( converterParameterizedType.getActualTypeArguments()[0] );
|
|
||||||
final Class<?> relationalJavaClass = GenericsHelper.extractClass( converterParameterizedType.getActualTypeArguments()[1] );
|
|
||||||
|
|
||||||
final JavaType<?> domainJtd = jtdRegistry.resolveDescriptor( domainJavaClass );
|
|
||||||
final JavaType<?> relationalJtd = jtdRegistry.resolveDescriptor( relationalJavaClass );
|
|
||||||
|
|
||||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
|
||||||
final JpaAttributeConverterImpl<?,?> valueConverter =
|
|
||||||
new JpaAttributeConverterImpl( bean, converterJtd, domainJtd, relationalJtd );
|
|
||||||
return new ConvertedBasicTypeImpl<>(
|
|
||||||
ConverterDescriptor.TYPE_NAME_PREFIX
|
|
||||||
+ valueConverter.getConverterJavaType().getTypeName(),
|
|
||||||
String.format(
|
|
||||||
"BasicType adapter for AttributeConverter<%s,%s>",
|
|
||||||
domainJtd.getTypeName(),
|
|
||||||
relationalJtd.getTypeName()
|
|
||||||
),
|
|
||||||
relationalJtd.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() ),
|
|
||||||
valueConverter
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static JdbcMapping resolveJavaType(Class<JavaType<?>> type, MetadataBuildingContext context) {
|
|
||||||
final TypeConfiguration typeConfiguration = context.getBootstrapContext().getTypeConfiguration();
|
|
||||||
final JavaType<?> jtd = getJavaType( type, context, typeConfiguration );
|
|
||||||
final JdbcType jdbcType = jtd.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() );
|
|
||||||
return typeConfiguration.getBasicTypeRegistry().resolve( jtd, jdbcType );
|
|
||||||
}
|
|
||||||
|
|
||||||
private static JavaType<?> getJavaType(
|
|
||||||
Class<JavaType<?>> javaTypeClass,
|
|
||||||
MetadataBuildingContext context,
|
|
||||||
TypeConfiguration typeConfiguration) {
|
|
||||||
final JavaType<?> registeredJtd = typeConfiguration.getJavaTypeRegistry().findDescriptor( javaTypeClass );
|
|
||||||
if ( registeredJtd != null ) {
|
|
||||||
return registeredJtd;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !context.getBuildingOptions().isAllowExtensionsInCdi() ) {
|
|
||||||
return FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( javaTypeClass );
|
|
||||||
}
|
|
||||||
|
|
||||||
return context.getBootstrapContext().getServiceRegistry()
|
|
||||||
.requireService( ManagedBeanRegistry.class )
|
|
||||||
.getBean( javaTypeClass )
|
|
||||||
.getBeanInstance();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void bindFetchProfilesForClass(XClass annotatedClass, MetadataBuildingContext context) {
|
public static void bindFetchProfilesForClass(XClass annotatedClass, MetadataBuildingContext context) {
|
||||||
bindFetchProfiles( annotatedClass, context );
|
bindFetchProfiles( annotatedClass, context );
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,234 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
|
||||||
|
*/
|
||||||
|
package org.hibernate.boot.model.internal;
|
||||||
|
|
||||||
|
import jakarta.persistence.AttributeConverter;
|
||||||
|
import org.hibernate.AnnotationException;
|
||||||
|
import org.hibernate.MappingException;
|
||||||
|
import org.hibernate.annotations.FilterDef;
|
||||||
|
import org.hibernate.annotations.FilterDefs;
|
||||||
|
import org.hibernate.annotations.ParamDef;
|
||||||
|
import org.hibernate.annotations.common.reflection.XAnnotatedElement;
|
||||||
|
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
|
||||||
|
import org.hibernate.boot.spi.BootstrapContext;
|
||||||
|
import org.hibernate.boot.spi.MetadataBuildingContext;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.engine.spi.FilterDefinition;
|
||||||
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
import org.hibernate.metamodel.mapping.JdbcMapping;
|
||||||
|
import org.hibernate.resource.beans.internal.FallbackBeanInstanceProducer;
|
||||||
|
import org.hibernate.resource.beans.spi.ManagedBean;
|
||||||
|
import org.hibernate.resource.beans.spi.ManagedBeanRegistry;
|
||||||
|
import org.hibernate.type.BasicType;
|
||||||
|
import org.hibernate.type.CustomType;
|
||||||
|
import org.hibernate.type.descriptor.converter.internal.JpaAttributeConverterImpl;
|
||||||
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators;
|
||||||
|
import org.hibernate.type.internal.ConvertedBasicTypeImpl;
|
||||||
|
import org.hibernate.type.spi.TypeConfiguration;
|
||||||
|
import org.hibernate.usertype.UserType;
|
||||||
|
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static java.util.Collections.emptyMap;
|
||||||
|
import static org.hibernate.boot.model.internal.BinderHelper.getOverridableAnnotation;
|
||||||
|
import static org.hibernate.internal.CoreLogging.messageLogger;
|
||||||
|
import static org.hibernate.internal.util.GenericsHelper.extractClass;
|
||||||
|
import static org.hibernate.internal.util.GenericsHelper.extractParameterizedType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gavin King
|
||||||
|
*/
|
||||||
|
class FilterDefBinder {
|
||||||
|
|
||||||
|
private static final CoreMessageLogger LOG = messageLogger( FilterDefBinder.class );
|
||||||
|
|
||||||
|
public static void bindFilterDef(FilterDef filterDef, MetadataBuildingContext context) {
|
||||||
|
final String name = filterDef.name();
|
||||||
|
if ( context.getMetadataCollector().getFilterDefinition( name ) != null ) {
|
||||||
|
throw new AnnotationException( "Multiple '@FilterDef' annotations define a filter named '" + name + "'" );
|
||||||
|
}
|
||||||
|
final Map<String, JdbcMapping> explicitParamJaMappings;
|
||||||
|
if ( filterDef.parameters().length == 0 ) {
|
||||||
|
explicitParamJaMappings = emptyMap();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
explicitParamJaMappings = new HashMap<>();
|
||||||
|
for ( ParamDef paramDef : filterDef.parameters() ) {
|
||||||
|
final JdbcMapping jdbcMapping = resolveFilterParamType( paramDef.type(), context );
|
||||||
|
if ( jdbcMapping == null ) {
|
||||||
|
throw new MappingException(
|
||||||
|
String.format(
|
||||||
|
Locale.ROOT,
|
||||||
|
"Unable to resolve type specified for parameter (%s) defined for @FilterDef (%s)",
|
||||||
|
paramDef.name(),
|
||||||
|
name
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
explicitParamJaMappings.put( paramDef.name(), jdbcMapping );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final FilterDefinition filterDefinition =
|
||||||
|
new FilterDefinition( name, filterDef.defaultCondition(), explicitParamJaMappings );
|
||||||
|
LOG.debugf( "Binding filter definition: %s", filterDefinition.getFilterName() );
|
||||||
|
context.getMetadataCollector().addFilterDefinition( filterDefinition );
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static JdbcMapping resolveFilterParamType(Class<?> type, MetadataBuildingContext context) {
|
||||||
|
if ( UserType.class.isAssignableFrom( type ) ) {
|
||||||
|
return resolveUserType( (Class<UserType<?>>) type, context );
|
||||||
|
}
|
||||||
|
else if ( AttributeConverter.class.isAssignableFrom( type ) ) {
|
||||||
|
return resolveAttributeConverter( (Class<AttributeConverter<?,?>>) type, context );
|
||||||
|
}
|
||||||
|
else if ( JavaType.class.isAssignableFrom( type ) ) {
|
||||||
|
return resolveJavaType( (Class<JavaType<?>>) type, context );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return resolveBasicType( type, context );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BasicType<Object> resolveBasicType(Class<?> type, MetadataBuildingContext context) {
|
||||||
|
final TypeConfiguration typeConfiguration = context.getBootstrapContext().getTypeConfiguration();
|
||||||
|
final JavaType<Object> jtd = typeConfiguration.getJavaTypeRegistry().findDescriptor( type );
|
||||||
|
if ( jtd != null ) {
|
||||||
|
final JdbcType jdbcType = jtd.getRecommendedJdbcType(
|
||||||
|
new JdbcTypeIndicators() {
|
||||||
|
@Override
|
||||||
|
public TypeConfiguration getTypeConfiguration() {
|
||||||
|
return typeConfiguration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPreferredSqlTypeCodeForBoolean() {
|
||||||
|
return context.getPreferredSqlTypeCodeForBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPreferredSqlTypeCodeForDuration() {
|
||||||
|
return context.getPreferredSqlTypeCodeForDuration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPreferredSqlTypeCodeForUuid() {
|
||||||
|
return context.getPreferredSqlTypeCodeForUuid();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPreferredSqlTypeCodeForInstant() {
|
||||||
|
return context.getPreferredSqlTypeCodeForInstant();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPreferredSqlTypeCodeForArray() {
|
||||||
|
return context.getPreferredSqlTypeCodeForArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialect getDialect() {
|
||||||
|
return context.getMetadataCollector().getDatabase().getDialect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return typeConfiguration.getBasicTypeRegistry().resolve( jtd, jdbcType );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static JdbcMapping resolveUserType(Class<UserType<?>> userTypeClass, MetadataBuildingContext context) {
|
||||||
|
final BootstrapContext bootstrapContext = context.getBootstrapContext();
|
||||||
|
final UserType<?> userType =
|
||||||
|
!context.getBuildingOptions().isAllowExtensionsInCdi()
|
||||||
|
? FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( userTypeClass )
|
||||||
|
: bootstrapContext.getServiceRegistry().requireService( ManagedBeanRegistry.class )
|
||||||
|
.getBean( userTypeClass ).getBeanInstance();
|
||||||
|
return new CustomType<>( userType, bootstrapContext.getTypeConfiguration() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static JdbcMapping resolveAttributeConverter(Class<AttributeConverter<?, ?>> type, MetadataBuildingContext context) {
|
||||||
|
final BootstrapContext bootstrapContext = context.getBootstrapContext();
|
||||||
|
final ManagedBean<AttributeConverter<?, ?>> bean =
|
||||||
|
bootstrapContext.getServiceRegistry()
|
||||||
|
.requireService( ManagedBeanRegistry.class )
|
||||||
|
.getBean( type );
|
||||||
|
|
||||||
|
final TypeConfiguration typeConfiguration = bootstrapContext.getTypeConfiguration();
|
||||||
|
final JavaTypeRegistry jtdRegistry = typeConfiguration.getJavaTypeRegistry();
|
||||||
|
|
||||||
|
final ParameterizedType converterParameterizedType = extractParameterizedType( bean.getBeanClass() );
|
||||||
|
final Class<?> domainJavaClass = extractClass( converterParameterizedType.getActualTypeArguments()[0] );
|
||||||
|
final Class<?> relationalJavaClass = extractClass( converterParameterizedType.getActualTypeArguments()[1] );
|
||||||
|
|
||||||
|
final JavaType<?> domainJtd = jtdRegistry.resolveDescriptor( domainJavaClass );
|
||||||
|
final JavaType<?> relationalJtd = jtdRegistry.resolveDescriptor( relationalJavaClass );
|
||||||
|
|
||||||
|
final JavaType<? extends AttributeConverter<?,?>> converterJtd =
|
||||||
|
jtdRegistry.resolveDescriptor( bean.getBeanClass() );
|
||||||
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
|
final JpaAttributeConverterImpl<?,?> valueConverter =
|
||||||
|
new JpaAttributeConverterImpl( bean, converterJtd, domainJtd, relationalJtd );
|
||||||
|
return new ConvertedBasicTypeImpl<>(
|
||||||
|
ConverterDescriptor.TYPE_NAME_PREFIX
|
||||||
|
+ valueConverter.getConverterJavaType().getTypeName(),
|
||||||
|
String.format(
|
||||||
|
"BasicType adapter for AttributeConverter<%s,%s>",
|
||||||
|
domainJtd.getTypeName(),
|
||||||
|
relationalJtd.getTypeName()
|
||||||
|
),
|
||||||
|
relationalJtd.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() ),
|
||||||
|
valueConverter
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static JdbcMapping resolveJavaType(Class<JavaType<?>> type, MetadataBuildingContext context) {
|
||||||
|
final TypeConfiguration typeConfiguration = context.getBootstrapContext().getTypeConfiguration();
|
||||||
|
final JavaType<?> jtd = getJavaType( type, context, typeConfiguration );
|
||||||
|
final JdbcType jdbcType = jtd.getRecommendedJdbcType( typeConfiguration.getCurrentBaseSqlTypeIndicators() );
|
||||||
|
return typeConfiguration.getBasicTypeRegistry().resolve( jtd, jdbcType );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static JavaType<?> getJavaType(Class<JavaType<?>> javaTypeClass,
|
||||||
|
MetadataBuildingContext context,
|
||||||
|
TypeConfiguration typeConfiguration) {
|
||||||
|
final JavaType<?> registeredJtd = typeConfiguration.getJavaTypeRegistry().findDescriptor( javaTypeClass );
|
||||||
|
if ( registeredJtd != null ) {
|
||||||
|
return registeredJtd;
|
||||||
|
}
|
||||||
|
else if ( !context.getBuildingOptions().isAllowExtensionsInCdi() ) {
|
||||||
|
return FallbackBeanInstanceProducer.INSTANCE.produceBeanInstance( javaTypeClass );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return context.getBootstrapContext().getServiceRegistry()
|
||||||
|
.requireService( ManagedBeanRegistry.class )
|
||||||
|
.getBean( javaTypeClass )
|
||||||
|
.getBeanInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void bindFilterDefs(XAnnotatedElement annotatedElement, MetadataBuildingContext context) {
|
||||||
|
final FilterDef filterDef = annotatedElement.getAnnotation( FilterDef.class );
|
||||||
|
final FilterDefs filterDefs = getOverridableAnnotation( annotatedElement, FilterDefs.class, context );
|
||||||
|
if ( filterDef != null ) {
|
||||||
|
bindFilterDef( filterDef, context );
|
||||||
|
}
|
||||||
|
if ( filterDefs != null ) {
|
||||||
|
for ( FilterDef def : filterDefs.value() ) {
|
||||||
|
bindFilterDef( def, context );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue