HHH-18060 - HbmXmlTransformer

HHH-18281 - Translate <filter-def/> and <filter/>

mostly filter parameter type handling
This commit is contained in:
Steve Ebersole 2024-06-18 02:26:32 -05:00
parent 4b4b818e25
commit 07db16cf7f
14 changed files with 516 additions and 258 deletions

View File

@ -39,6 +39,7 @@ import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmCompositeCollectionElementType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmCompositeIdType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmCompositeKeyBasicAttributeType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmCompositeKeyManyToOneType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmConfigParameterContainer;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmConfigParameterType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmDiscriminatorSubclassEntityType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmDynamicComponentType;
@ -91,6 +92,8 @@ import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmSimpleIdType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmSubclassEntityBaseDefinition;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmSynchronizeType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmTimestampAttributeType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmTypeDefinitionType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmTypeSpecificationType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmUnionSubclassEntityType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmVersionAttributeType;
import org.hibernate.boot.jaxb.hbm.spi.PluralAttributeInfo;
@ -103,6 +106,7 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbAnyMappingKeyImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbAttributesContainer;
import org.hibernate.boot.jaxb.mapping.spi.JaxbAttributesContainerImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbBasicImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbBasicMapping;
import org.hibernate.boot.jaxb.mapping.spi.JaxbCachingImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbCascadeTypeImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbCheckConstraintImpl;
@ -127,10 +131,10 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityResultImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFetchProfileImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFieldResultImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFilterDefImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbForeignKeyImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbGeneratedValueImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbGenericIdGeneratorImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbHbmFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbHqlImportImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbIdClassImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbIdImpl;
@ -256,7 +260,6 @@ public class HbmXmlTransformer {
transfer( hbmXmlMapping::isDefaultLazy, ormRoot::setDefaultLazy );
transferIdentifierGenerators();
transferTypeDefs();
transferFilterDefinitions();
transferImports();
transferEntities();
@ -320,7 +323,7 @@ public class HbmXmlTransformer {
Locale.ROOT,
message,
messageArgs
)
) + " (" + origin + ")"
);
case PICK -> {
if ( pickHandler != null ) {
@ -332,17 +335,6 @@ public class HbmXmlTransformer {
}
}
private void transferTypeDefs() {
if ( hbmXmlMapping.getTypedef().isEmpty() ) {
return;
}
handleUnsupported(
"Transformation of type-def mapping not supported - `%s`",
origin
);
}
private void transferIdentifierGenerators() {
if ( hbmXmlMapping.getIdentifierGenerator().isEmpty() ) {
return;
@ -1385,22 +1377,7 @@ public class HbmXmlTransformer {
basic.setAttributeAccessor( hbmProp.getAccess() );
basic.setOptimisticLock( hbmProp.isOptimisticLock() );
if ( isNotEmpty( hbmProp.getTypeAttribute() ) ) {
basic.setType( new JaxbUserTypeImpl() );
basic.getType().setValue( hbmProp.getTypeAttribute() );
}
else {
if ( hbmProp.getType() != null ) {
basic.setType( new JaxbUserTypeImpl() );
basic.getType().setValue( hbmProp.getType().getName() );
for ( JaxbHbmConfigParameterType hbmParam : hbmProp.getType().getConfigParameters() ) {
final JaxbConfigurationParameterImpl param = new JaxbConfigurationParameterImpl();
param.setName( hbmParam.getName() );
param.setValue( hbmParam.getValue() );
basic.getType().getParameters().add( param );
}
}
}
applyBasicType( basic, hbmProp.getTypeAttribute(), hbmProp.getType() );
transferColumnsAndFormulas(
new ColumnAndFormulaSource() {
@ -1484,6 +1461,56 @@ public class HbmXmlTransformer {
);
}
private void applyBasicType(JaxbBasicMapping target, String hbmTypeAttribute, JaxbHbmTypeSpecificationType hbmTypeNode) {
if ( isNotEmpty( hbmTypeAttribute ) ) {
final JaxbUserTypeImpl typeNode = interpretBasicType(
hbmTypeAttribute,
null,
transformationState.getTypeDefinitionMap().get( hbmTypeAttribute )
);
target.setType( typeNode );
}
if ( hbmTypeNode != null ) {
final JaxbUserTypeImpl typeNode = interpretBasicType(
hbmTypeNode.getName(),
hbmTypeNode,
transformationState.getTypeDefinitionMap().get( hbmTypeNode.getName() )
);
target.setType( typeNode );
}
}
private JaxbUserTypeImpl interpretBasicType(String typeName, JaxbHbmConfigParameterContainer typeLocalParams, JaxbHbmTypeDefinitionType typeDef) {
assert StringHelper.isNotEmpty( typeName );
final JaxbUserTypeImpl typeNode = new JaxbUserTypeImpl();
if ( typeDef == null ) {
typeNode.setValue( typeName );
}
else {
typeNode.setValue( typeDef.getClazz() );
for ( JaxbHbmConfigParameterType hbmParam : typeDef.getConfigParameters() ) {
final JaxbConfigurationParameterImpl param = new JaxbConfigurationParameterImpl();
param.setName( hbmParam.getName() );
param.setValue( hbmParam.getValue() );
typeNode.getParameters().add( param );
}
}
if ( typeLocalParams != null ) {
for ( JaxbHbmConfigParameterType hbmParam : typeLocalParams.getConfigParameters() ) {
final JaxbConfigurationParameterImpl param = new JaxbConfigurationParameterImpl();
param.setName( hbmParam.getName() );
param.setValue( hbmParam.getValue() );
typeNode.getParameters().add( param );
}
}
return typeNode;
}
private JaxbEmbeddableImpl applyEmbeddable(JaxbEntityMappingsImpl ormRoot, JaxbHbmCompositeAttributeType hbmComponent) {
final String embeddableClassName = hbmComponent.getClazz();
if ( StringHelper.isNotEmpty( embeddableClassName ) ) {
@ -2057,9 +2084,6 @@ public class HbmXmlTransformer {
if ( StringHelper.isNotEmpty( hbmAttributeInfo.getCollectionType() ) ) {
handleUnsupported( "Collection-type is not supported for transformation" );
}
if ( CollectionHelper.isNotEmpty( hbmAttributeInfo.getFilter() ) ) {
handleUnsupported( "Filters are not supported for transformation" );
}
if ( StringHelper.isNotEmpty( hbmAttributeInfo.getWhere() ) ) {
handleUnsupported( "SQL restrictions are not supported for transformation" );
}
@ -2082,9 +2106,6 @@ public class HbmXmlTransformer {
if ( !(hbmOneToMany.getNode() == null || hbmOneToMany.getNode().isBlank() ) ) {
handleUnsupported( "`node` not supported for transformation" );
}
if ( hbmOneToMany.getNotFound() != null ) {
target.setNotFound( interpretNotFoundAction( hbmOneToMany.getNotFound() ) );
}
transferCollectionBasicInfo( hbmAttributeInfo, target );
target.setTargetEntity( StringHelper.isNotEmpty( hbmOneToMany.getClazz() ) ? hbmOneToMany.getClazz() : hbmOneToMany.getEntityName() );
@ -2104,8 +2125,16 @@ public class HbmXmlTransformer {
// oneToMany.setOnDelete( ?? );
}
if ( hbmOneToMany.getNotFound() != null ) {
target.setNotFound( interpretNotFoundAction( hbmOneToMany.getNotFound() ) );
}
target.setOrphanRemoval( isOrphanRemoval( hbmAttributeInfo.getCascade() ) );
target.setCascade( convertCascadeType( hbmAttributeInfo.getCascade() ) );
for ( JaxbHbmFilterType hbmFilter : hbmAttributeInfo.getFilter() ) {
target.getFilters().add( convert( hbmFilter ) );
}
}
private JaxbManyToManyImpl transformManyToMany(PluralAttributeInfo hbmCollection) {
@ -2121,9 +2150,6 @@ public class HbmXmlTransformer {
if ( StringHelper.isNotEmpty( hbmCollection.getCollectionType() ) ) {
handleUnsupported( "Collection-type is not supported for transformation" );
}
if ( CollectionHelper.isNotEmpty( hbmCollection.getFilter() ) ) {
handleUnsupported( "Filters are not supported for transformation" );
}
if ( StringHelper.isNotEmpty( hbmCollection.getWhere() ) ) {
handleUnsupported( "SQL restrictions are not supported for transformation" );
}
@ -2152,6 +2178,10 @@ public class HbmXmlTransformer {
transferCollectionBasicInfo( hbmCollection, target );
target.setTargetEntity( StringHelper.isNotEmpty( manyToMany.getClazz() ) ? manyToMany.getClazz() : manyToMany.getEntityName() );
for ( JaxbHbmFilterType hbmFilter : hbmCollection.getFilter() ) {
target.getFilters().add( convert( hbmFilter ) );
}
}
private JaxbPluralAnyMappingImpl transformPluralAny(PluralAttributeInfo hbmCollection) {
@ -2285,9 +2315,7 @@ public class HbmXmlTransformer {
}
}
// if ( isNotEmpty( source.getTypeAttribute() ) || source.getType() != null ) {
// handleUnsupported( "<id/> specified type which is not supported" );
// }
applyBasicType( target, source.getTypeAttribute(), source.getType() );
target.setUnsavedValue( source.getUnsavedValue() );
@ -2632,8 +2660,8 @@ public class HbmXmlTransformer {
return hbmOnDelete == JaxbHbmOnDeleteEnum.CASCADE ? OnDeleteAction.CASCADE : OnDeleteAction.NO_ACTION;
}
private JaxbHbmFilterImpl convert(JaxbHbmFilterType hbmFilter) {
final JaxbHbmFilterImpl filter = new JaxbHbmFilterImpl();
private JaxbFilterImpl convert(JaxbHbmFilterType hbmFilter) {
final JaxbFilterImpl filter = new JaxbFilterImpl();
filter.setName( hbmFilter.getName() );
final boolean shouldAutoInjectAliases = hbmFilter.getAutoAliasInjection() == null
@ -2648,7 +2676,7 @@ public class HbmXmlTransformer {
}
else {
final JaxbHbmFilterAliasMappingType hbmAliasMapping = (JaxbHbmFilterAliasMappingType) content;
final JaxbHbmFilterImpl.JaxbAliasesImpl aliasMapping = new JaxbHbmFilterImpl.JaxbAliasesImpl();
final JaxbFilterImpl.JaxbAliasesImpl aliasMapping = new JaxbFilterImpl.JaxbAliasesImpl();
aliasMapping.setAlias( hbmAliasMapping.getAlias() );
aliasMapping.setEntity( hbmAliasMapping.getEntity() );
aliasMapping.setTable( hbmAliasMapping.getTable() );

View File

@ -40,10 +40,19 @@ public class TransformationPreprocessor {
final EntityMappingConsumer entityMappingConsumer = new EntityMappingConsumer( transformationState );
final Map<String, JaxbEntityImpl> rootClassesMap = new HashMap<>();
collectGlobalState( hbmXmlBindings, transformationState );
processStructuredHierarchies( hbmXmlBindings, rootClassesMap, entityMappingConsumer );
processSeparatedHierarchies( hbmXmlBindings, rootClassesMap, entityMappingConsumer );
}
private static void collectGlobalState(
List<Binding<JaxbHbmHibernateMapping>> hbmXmlBindings,
TransformationState transformationState) {
hbmXmlBindings.forEach( (hbmBinding) -> {
hbmBinding.getRoot().getTypedef().forEach( transformationState::acceptTypeDefinition );
} );
}
private static void processStructuredHierarchies(
Collection<Binding<JaxbHbmHibernateMapping>> hbmXmlBindings,
Map<String, JaxbEntityImpl> rootClassesMap,

View File

@ -13,7 +13,9 @@ import java.util.Map;
import org.hibernate.boot.jaxb.Origin;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmEntityBaseDefinition;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmFilterDefinitionType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmTypeDefinitionType;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.jaxb.spi.Binding;
@ -30,6 +32,9 @@ class TransformationState {
private final Map<String, JaxbEntityImpl> entityMap = new HashMap<>();
private final Map<JaxbHbmEntityBaseDefinition, JaxbEntityImpl> entityXref = new HashMap<>();
private final Map<String, JaxbHbmTypeDefinitionType> typeDefMap = new HashMap<>();
private final Map<String, JaxbHbmFilterDefinitionType> filterDefMap = new HashMap<>();
public TransformationState(List<Binding<JaxbHbmHibernateMapping>> hbmBindings) {
this.hbmBindings = hbmBindings;
this.mappingBindings = CollectionHelper.arrayList( hbmBindings.size() );
@ -119,6 +124,7 @@ class TransformationState {
return resolved;
}
public List<Binding<JaxbHbmHibernateMapping>> getHbmBindings() {
return hbmBindings;
}
@ -134,4 +140,12 @@ class TransformationState {
public Map<JaxbHbmEntityBaseDefinition, JaxbEntityImpl> getEntityXref() {
return entityXref;
}
public Map<String, JaxbHbmTypeDefinitionType> getTypeDefinitionMap() {
return typeDefMap;
}
public void acceptTypeDefinition(JaxbHbmTypeDefinitionType hbmTypeDef) {
typeDefMap.put( hbmTypeDef.getName(), hbmTypeDef );
}
}

View File

@ -112,7 +112,7 @@ public interface JaxbEntity extends JaxbEntityOrMappedSuperclass {
List<JaxbNamedEntityGraphImpl> getNamedEntityGraphs();
List<JaxbHbmFilterImpl> getFilters();
List<JaxbFilterImpl> getFilters();
List<JaxbFetchProfileImpl> getFetchProfiles();

View File

@ -91,7 +91,7 @@ public interface JaxbPluralAttribute extends JaxbPersistentAttribute, JaxbLockab
JaxbCustomSqlImpl getSqlDeleteAll();
void setSqlDeleteAll(JaxbCustomSqlImpl sqlDeleteAll);
List<JaxbHbmFilterImpl> getFilters();
List<JaxbFilterImpl> getFilters();
@Override
default Boolean isOptional() {

View File

@ -9,7 +9,7 @@ package org.hibernate.boot.models.annotations.internal;
import java.lang.annotation.Annotation;
import org.hibernate.annotations.Filter;
import org.hibernate.boot.jaxb.mapping.spi.JaxbHbmFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFilterImpl;
import org.hibernate.boot.models.HibernateAnnotations;
import org.hibernate.boot.models.annotations.spi.FilterDetails;
import org.hibernate.boot.models.xml.internal.FilterProcessing;
@ -111,7 +111,7 @@ public class FilterAnnotation implements Filter, FilterDetails {
@Override
public void apply(JaxbHbmFilterImpl jaxbFilter, XmlDocumentContext xmlDocumentContext) {
public void apply(JaxbFilterImpl jaxbFilter, XmlDocumentContext xmlDocumentContext) {
name( jaxbFilter.getName() );
if ( StringHelper.isNotEmpty( jaxbFilter.getCondition() ) ) {

View File

@ -9,7 +9,7 @@ package org.hibernate.boot.models.annotations.internal;
import java.lang.annotation.Annotation;
import org.hibernate.annotations.FilterJoinTable;
import org.hibernate.boot.jaxb.mapping.spi.JaxbHbmFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFilterImpl;
import org.hibernate.boot.models.annotations.spi.FilterDetails;
import org.hibernate.boot.models.xml.internal.FilterProcessing;
import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
@ -109,7 +109,7 @@ public class FilterJoinTableAnnotation implements FilterJoinTable, FilterDetails
}
@Override
public void apply(JaxbHbmFilterImpl jaxbFilter, XmlDocumentContext xmlDocumentContext) {
public void apply(JaxbFilterImpl jaxbFilter, XmlDocumentContext xmlDocumentContext) {
name( jaxbFilter.getName() );
if ( StringHelper.isNotEmpty( jaxbFilter.getCondition() ) ) {

View File

@ -6,7 +6,7 @@
*/
package org.hibernate.boot.models.annotations.spi;
import org.hibernate.boot.jaxb.mapping.spi.JaxbHbmFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFilterImpl;
import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
/**
@ -18,5 +18,5 @@ import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
* @author Steve Ebersole
*/
public interface FilterDetails {
void apply(JaxbHbmFilterImpl jaxbFilter, XmlDocumentContext xmlDocumentContext);
void apply(JaxbFilterImpl jaxbFilter, XmlDocumentContext xmlDocumentContext);
}

View File

@ -578,18 +578,17 @@ public class GlobalRegistrationsImpl implements GlobalRegistrations {
parameterResolvers = new HashMap<>();
for ( JaxbFilterDefImpl.JaxbFilterParamImpl jaxbParameter : jaxbParameters ) {
final ClassDetails targetClassDetails = XmlAnnotationHelper.resolveJavaType(
final ClassDetails targetClassDetails = XmlAnnotationHelper.resolveSimpleJavaType(
jaxbParameter.getType(),
sourceModelContext.getClassDetailsRegistry()
);
paramJdbcMappings.put( jaxbParameter.getName(), targetClassDetails );
if ( isNotEmpty( jaxbParameter.getResolver() ) ) {
final ClassDetails resolverClassDetails = XmlAnnotationHelper.resolveJavaType(
jaxbParameter.getType(),
sourceModelContext.getClassDetailsRegistry()
parameterResolvers.put(
jaxbParameter.getName(),
sourceModelContext.getClassDetailsRegistry().resolveClassDetails( jaxbParameter.getResolver() )
);
parameterResolvers.put( jaxbParameter.getName(), resolverClassDetails );
}
}
}

View File

@ -9,7 +9,7 @@ package org.hibernate.boot.models.xml.internal;
import java.util.List;
import org.hibernate.annotations.SqlFragmentAlias;
import org.hibernate.boot.jaxb.mapping.spi.JaxbHbmFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFilterImpl;
import org.hibernate.boot.models.HibernateAnnotations;
import org.hibernate.boot.models.annotations.internal.SqlFragmentAliasAnnotation;
import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
@ -24,7 +24,7 @@ public class FilterProcessing {
private static final SqlFragmentAlias[] NO_ALIASES = new SqlFragmentAlias[0];
public static SqlFragmentAlias[] collectSqlFragmentAliases(
List<JaxbHbmFilterImpl.JaxbAliasesImpl> jaxbAliases,
List<JaxbFilterImpl.JaxbAliasesImpl> jaxbAliases,
XmlDocumentContext xmlDocumentContext) {
if ( CollectionHelper.isEmpty( jaxbAliases ) ) {
return NO_ALIASES;
@ -32,12 +32,12 @@ public class FilterProcessing {
final SqlFragmentAlias[] result = new SqlFragmentAlias[jaxbAliases.size()];
for ( int i = 0; i < jaxbAliases.size(); i++ ) {
final SqlFragmentAliasAnnotation alias = (SqlFragmentAliasAnnotation) HibernateAnnotations.SQL_FRAGMENT_ALIAS.createUsage(
final SqlFragmentAliasAnnotation alias = HibernateAnnotations.SQL_FRAGMENT_ALIAS.createUsage(
xmlDocumentContext.getModelBuildingContext()
);
result[i] = alias;
final JaxbHbmFilterImpl.JaxbAliasesImpl jaxbAlias = jaxbAliases.get( i );
final JaxbFilterImpl.JaxbAliasesImpl jaxbAlias = jaxbAliases.get( i );
alias.alias( jaxbAlias.getAlias() );
if ( StringHelper.isNotEmpty( jaxbAlias.getTable() ) ) {
alias.table( jaxbAlias.getTable() );

View File

@ -0,0 +1,339 @@
/*
* 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.models.xml.internal;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.NClob;
import java.sql.Time;
import java.sql.Timestamp;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.Year;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Currency;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
import java.util.UUID;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.type.descriptor.java.BasicJavaType;
import org.hibernate.type.descriptor.java.BigDecimalJavaType;
import org.hibernate.type.descriptor.java.BigIntegerJavaType;
import org.hibernate.type.descriptor.java.BlobJavaType;
import org.hibernate.type.descriptor.java.BooleanJavaType;
import org.hibernate.type.descriptor.java.ByteJavaType;
import org.hibernate.type.descriptor.java.CalendarJavaType;
import org.hibernate.type.descriptor.java.CharacterJavaType;
import org.hibernate.type.descriptor.java.ClassJavaType;
import org.hibernate.type.descriptor.java.ClobJavaType;
import org.hibernate.type.descriptor.java.CurrencyJavaType;
import org.hibernate.type.descriptor.java.DoubleJavaType;
import org.hibernate.type.descriptor.java.DurationJavaType;
import org.hibernate.type.descriptor.java.FloatJavaType;
import org.hibernate.type.descriptor.java.InetAddressJavaType;
import org.hibernate.type.descriptor.java.InstantJavaType;
import org.hibernate.type.descriptor.java.IntegerJavaType;
import org.hibernate.type.descriptor.java.JdbcDateJavaType;
import org.hibernate.type.descriptor.java.JdbcTimeJavaType;
import org.hibernate.type.descriptor.java.JdbcTimestampJavaType;
import org.hibernate.type.descriptor.java.LocalDateJavaType;
import org.hibernate.type.descriptor.java.LocalDateTimeJavaType;
import org.hibernate.type.descriptor.java.LocalTimeJavaType;
import org.hibernate.type.descriptor.java.LocaleJavaType;
import org.hibernate.type.descriptor.java.LongJavaType;
import org.hibernate.type.descriptor.java.NClobJavaType;
import org.hibernate.type.descriptor.java.OffsetDateTimeJavaType;
import org.hibernate.type.descriptor.java.OffsetTimeJavaType;
import org.hibernate.type.descriptor.java.ShortJavaType;
import org.hibernate.type.descriptor.java.StringJavaType;
import org.hibernate.type.descriptor.java.TimeZoneJavaType;
import org.hibernate.type.descriptor.java.UUIDJavaType;
import org.hibernate.type.descriptor.java.UrlJavaType;
import org.hibernate.type.descriptor.java.YearJavaType;
import org.hibernate.type.descriptor.java.ZoneIdJavaType;
import org.hibernate.type.descriptor.java.ZoneOffsetJavaType;
import org.hibernate.type.descriptor.java.ZonedDateTimeJavaType;
/**
* @author Steve Ebersole
*/
public enum SimpleTypeInterpretation {
BOOLEAN( Boolean.class, BooleanJavaType.class ),
BYTE( Byte.class, ByteJavaType.class ),
SHORT( Short.class, ShortJavaType.class ),
INTEGER( Integer.class, IntegerJavaType.class ),
LONG( Long.class, LongJavaType.class ),
DOUBLE( Double.class, DoubleJavaType.class ),
FLOAT( Float.class, FloatJavaType.class ),
BIG_INTEGER( BigInteger.class, BigIntegerJavaType.class ),
BIG_DECIMAL( BigDecimal.class, BigDecimalJavaType.class ),
CHARACTER( Character.class, CharacterJavaType.class ),
STRING( String.class, StringJavaType.class ),
INSTANT( Instant.class, InstantJavaType.class ),
DURATION( Duration.class, DurationJavaType.class ),
YEAR( Year.class, YearJavaType.class ),
LOCAL_DATE_TIME( LocalDateTime.class, LocalDateTimeJavaType.class ),
LOCAL_DATE( LocalDate.class, LocalDateJavaType.class ),
LOCAL_TIME( LocalTime.class, LocalTimeJavaType.class ),
OFFSET_DATE_TIME( OffsetDateTime.class, OffsetDateTimeJavaType.class ),
OFFSET_TIME( OffsetTime.class, OffsetTimeJavaType.class ),
ZONED_DATE_TIME( ZonedDateTime.class, ZonedDateTimeJavaType.class ),
ZONE_ID( ZoneId.class, ZoneIdJavaType.class ),
ZONE_OFFSET( ZoneOffset.class, ZoneOffsetJavaType.class ),
UUID( UUID .class, UUIDJavaType.class ),
URL( java.net.URL.class, UrlJavaType.class ),
INET_ADDRESS( InetAddress.class, InetAddressJavaType.class ),
CURRENCY( Currency.class, CurrencyJavaType.class ),
LOCALE( Locale.class, LocaleJavaType.class ),
CLASS( Class.class, ClassJavaType.class ),
BLOB( Blob.class, BlobJavaType.class ),
CLOB( Clob.class, ClobJavaType.class ),
NCLOB( NClob.class, NClobJavaType.class ),
JDBC_TIMESTAMP( Timestamp.class, JdbcTimestampJavaType.class ),
JDBC_DATE( Date.class, JdbcDateJavaType.class ),
JDBC_TIME( Time.class, JdbcTimeJavaType.class ),
CALENDAR( Calendar.class, CalendarJavaType.class ),
TIME_ZONE( TimeZone.class, TimeZoneJavaType.class )
;
SimpleTypeInterpretation(Class<?> javaType, Class<? extends BasicJavaType<?>> javaTypeDescriptorType) {
this.javaType = javaType;
this.javaTypeDescriptorType = javaTypeDescriptorType;
}
private final Class<?> javaType;
private final Class<? extends BasicJavaType<?>> javaTypeDescriptorType;
public Class<?> getJavaType() {
return javaType;
}
public Class<? extends BasicJavaType<?>> getJavaTypeDescriptorType() {
return javaTypeDescriptorType;
}
public static SimpleTypeInterpretation interpret(String name) {
assert StringHelper.isNotEmpty( name );
if ( name.equalsIgnoreCase( "boolean" )
|| Boolean.class.getName().equals( name ) ) {
return BOOLEAN;
}
if ( name.equalsIgnoreCase( "byte" )
|| Byte.class.getName().equals( name ) ) {
return BYTE;
}
if ( name.equalsIgnoreCase( "short" )
|| Short.class.getName().equals( name ) ) {
return SHORT;
}
if ( name.equalsIgnoreCase( "int" )
|| name.equalsIgnoreCase( "integer" )
|| Integer.class.getName().equals( name ) ) {
return INTEGER;
}
if ( name.equalsIgnoreCase( "long" )
|| Long.class.getName().equals( name ) ) {
return LONG;
}
if ( name.equalsIgnoreCase( "double" )
|| Double.class.getName().equals( name ) ) {
return DOUBLE;
}
if ( name.equalsIgnoreCase( "float" )
|| Float.class.getName().equals( name ) ) {
return FLOAT;
}
if ( name.equalsIgnoreCase( "biginteger" )
|| name.equalsIgnoreCase( "big_integer" )
|| BigInteger.class.getName().equals( name ) ) {
return BIG_INTEGER;
}
if ( name.equalsIgnoreCase( "bigdecimal" )
|| name.equalsIgnoreCase( "big_decimal" )
|| BigDecimal.class.getName().equals( name ) ) {
return BIG_DECIMAL;
}
if ( name.equalsIgnoreCase( "char" )
|| name.equalsIgnoreCase( "character" )
|| Character.class.getName().equalsIgnoreCase( name ) ) {
return CHARACTER;
}
if ( name.equalsIgnoreCase( "string" )
|| String.class.getName().equalsIgnoreCase( name ) ) {
return STRING;
}
if ( name.equalsIgnoreCase( "instant" )
|| Instant.class.getName().equals( name ) ) {
return INSTANT;
}
if ( name.equalsIgnoreCase( "duration" )
|| Duration.class.getName().equals( name ) ) {
return DURATION;
}
if ( name.equalsIgnoreCase( "year" )
|| Year.class.getName().equals( name ) ) {
return YEAR;
}
if ( name.equalsIgnoreCase( "localdatetime" )
|| name.equalsIgnoreCase( "local_date_time" )
|| LocalDateTime.class.getName().equals( name ) ) {
return LOCAL_DATE_TIME;
}
if ( name.equalsIgnoreCase( "localdate" )
|| name.equalsIgnoreCase( "local_date" )
|| LocalDate.class.getName().equals( name ) ) {
return LOCAL_DATE;
}
if ( name.equalsIgnoreCase( "localtime" )
|| name.equalsIgnoreCase( "local_time" )
|| LocalTime.class.getName().equals( name ) ) {
return LOCAL_TIME;
}
if ( name.equalsIgnoreCase( "zoneddatetime" )
|| name.equalsIgnoreCase( "zoned_date_time" )
|| ZonedDateTime.class.getName().equals( name ) ) {
return ZONED_DATE_TIME;
}
if ( name.equalsIgnoreCase( "offsetdatetime" )
|| name.equalsIgnoreCase( "offset_date_time" )
|| OffsetDateTime.class.getName().equals( name ) ) {
return OFFSET_DATE_TIME;
}
if ( name.equalsIgnoreCase( "offsettime" )
|| name.equalsIgnoreCase( "offset_time" )
|| OffsetTime.class.getName().equals( name ) ) {
return OFFSET_TIME;
}
if ( name.equalsIgnoreCase( "zoneid" )
|| name.equalsIgnoreCase( "zone_id" )
|| ZoneId.class.getName().equals( name ) ) {
return ZONE_ID;
}
if ( name.equalsIgnoreCase( "zoneoffset" )
|| name.equalsIgnoreCase( "zone_offset" )
|| ZoneOffset.class.getName().equals( name ) ) {
return ZONE_OFFSET;
}
if ( name.equalsIgnoreCase( "uuid" )
|| UUID.class.getName().equals( name ) ) {
return UUID;
}
if ( name.equalsIgnoreCase( "url" )
|| java.net.URL.class.getName().equals( name ) ) {
return URL;
}
if ( name.equalsIgnoreCase( "inet" )
|| name.equalsIgnoreCase( "inetaddress" )
|| name.equalsIgnoreCase( "inet_address" )
|| InetAddress.class.getName().equals( name ) ) {
return INET_ADDRESS;
}
if ( name.equalsIgnoreCase( "currency" )
|| Currency.class.getName().equals( name ) ) {
return CURRENCY;
}
if ( name.equalsIgnoreCase( "locale" )
|| Locale.class.getName().equals( name ) ) {
return LOCALE;
}
if ( name.equalsIgnoreCase( "class" )
|| Class.class.getName().equals( name ) ) {
return CLASS;
}
if ( name.equalsIgnoreCase( "blob" )
|| Blob.class.getName().equals( name ) ) {
return BLOB;
}
if ( name.equalsIgnoreCase( "clob" )
|| Clob.class.getName().equals( name ) ) {
return CLOB;
}
if ( name.equalsIgnoreCase( "nclob" )
|| NClob.class.getName().equals( name ) ) {
return NCLOB;
}
if ( name.equalsIgnoreCase( "timestamp" )
|| name.equalsIgnoreCase( "time_stamp" )
|| java.util.Date.class.getName().equals( name )
|| Timestamp.class.getName().equals( name ) ) {
return JDBC_TIMESTAMP;
}
if ( name.equalsIgnoreCase( "date" )
|| java.sql.Date.class.getName().equals( name ) ) {
return JDBC_DATE;
}
if ( name.equalsIgnoreCase( "time" )
|| java.sql.Time.class.getName().equals( name ) ) {
return JDBC_TIME;
}
if ( name.equalsIgnoreCase( "calendar" )
|| name.equalsIgnoreCase( "gregoriancalendar" )
|| name.equalsIgnoreCase( "gregorian_calendar" )
|| Calendar.class.getName().equals( name )
|| GregorianCalendar.class.getName().equals( name ) ) {
return CALENDAR;
}
if ( name.equalsIgnoreCase( "timezone" )
|| name.equalsIgnoreCase( "time_zone" )
|| TimeZone.class.getName().equals( name ) ) {
return TIME_ZONE;
}
return null;
}
}

View File

@ -10,30 +10,8 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.URL;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.NClob;
import java.sql.Timestamp;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.Year;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Currency;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.UUID;
import java.util.function.Consumer;
@ -64,9 +42,9 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerContainerImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityOrMappedSuperclass;
import org.hibernate.boot.jaxb.mapping.spi.JaxbFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbGeneratedValueImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbGenericIdGeneratorImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbHbmFilterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbIdClassImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbIndexImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbJoinColumnImpl;
@ -292,173 +270,52 @@ public class XmlAnnotationHelper {
XmlDocumentContext xmlDocumentContext) {
if ( jaxbType == null || StringHelper.isEmpty( jaxbType.getValue() ) ) {
cases.handleNone( jaxbType, memberDetails, xmlDocumentContext );
return;
}
else if ( jaxbType.getValue().equalsIgnoreCase( "char" )
|| jaxbType.getValue().equalsIgnoreCase( "character" )
|| Character.class.getName().equalsIgnoreCase( jaxbType.getValue() ) ) {
cases.handleCharacter( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "string" )
|| String.class.getName().equalsIgnoreCase( jaxbType.getValue() ) ) {
cases.handleString( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "byte" )
|| Byte.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleByte( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "boolean" )
|| Boolean.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleBoolean( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "short" )
|| Short.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleShort( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "int" )
|| jaxbType.getValue().equalsIgnoreCase( "integer" )
|| Integer.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleInteger( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "long" )
|| Long.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleLong( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "double" )
|| Double.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleDouble( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "float" )
|| Float.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleFloat( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "biginteger" )
|| jaxbType.getValue().equalsIgnoreCase( "big_integer" )
|| BigInteger.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleBigInteger( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "bigdecimal" )
|| jaxbType.getValue().equalsIgnoreCase( "big_decimal" )
|| BigDecimal.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleBigDecimal( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "uuid" )
|| UUID.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleUuid( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "url" )
|| URL.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleUrl( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "inet" )
|| jaxbType.getValue().equalsIgnoreCase( "inetaddress" )
|| jaxbType.getValue().equalsIgnoreCase( "inet_address" )
|| InetAddress.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleInetAddress( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "currency" )
|| Currency.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleCurrency( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "locale" )
|| Locale.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleLocale( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "class" )
|| Class.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleClass( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "blob" )
|| Blob.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleBlob( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "clob" )
|| Clob.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleClob( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "nclob" )
|| NClob.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleNClob( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "instant" )
|| Instant.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleInstant( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "duration" )
|| Duration.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleDuration( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "year" )
|| Year.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleYear( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "localdatetime" )
|| jaxbType.getValue().equalsIgnoreCase( "local_date_time" )
|| LocalDateTime.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleLocalDateTime( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "localdate" )
|| jaxbType.getValue().equalsIgnoreCase( "local_date" )
|| LocalDate.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleLocalDate( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "localtime" )
|| jaxbType.getValue().equalsIgnoreCase( "local_time" )
|| LocalTime.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleLocalTime( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "zoneddatetime" )
|| jaxbType.getValue().equalsIgnoreCase( "zoned_date_time" )
|| ZonedDateTime.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleZonedDateTime( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "offsetdatetime" )
|| jaxbType.getValue().equalsIgnoreCase( "offset_date_time" )
|| OffsetDateTime.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleOffsetDateTime( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "offsettime" )
|| jaxbType.getValue().equalsIgnoreCase( "offset_time" )
|| OffsetTime.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleOffsetTime( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "zoneid" )
|| jaxbType.getValue().equalsIgnoreCase( "zone_id" )
|| ZoneId.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleZoneId( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "zoneoffset" )
|| jaxbType.getValue().equalsIgnoreCase( "zone_offset" )
|| ZoneOffset.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleZoneOffset( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "timestamp" )
|| jaxbType.getValue().equalsIgnoreCase( "time_stamp" )
|| java.util.Date.class.getName().equals( jaxbType.getValue() )
|| Timestamp.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleTimestamp( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "date" )
|| java.sql.Date.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleDate( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "time" )
|| java.sql.Time.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleTime( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "calendar" )
|| jaxbType.getValue().equalsIgnoreCase( "gregoriancalendar" )
|| jaxbType.getValue().equalsIgnoreCase( "gregorian_calendar" )
|| Calendar.class.getName().equals( jaxbType.getValue() )
|| GregorianCalendar.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleCalendar( jaxbType, memberDetails, xmlDocumentContext );
}
else if ( jaxbType.getValue().equalsIgnoreCase( "timezone" )
|| jaxbType.getValue().equalsIgnoreCase( "time_zone" )
|| TimeZone.class.getName().equals( jaxbType.getValue() ) ) {
cases.handleTimeZone( jaxbType, memberDetails, xmlDocumentContext );
}
else {
final SimpleTypeInterpretation interpretation = SimpleTypeInterpretation.interpret( jaxbType.getValue() );
if ( interpretation == null ) {
cases.handleGeneral( jaxbType, memberDetails, xmlDocumentContext );
return;
}
switch ( interpretation ) {
case BOOLEAN -> cases.handleBoolean( jaxbType, memberDetails, xmlDocumentContext );
case BYTE -> cases.handleByte( jaxbType, memberDetails, xmlDocumentContext );
case SHORT -> cases.handleShort( jaxbType, memberDetails, xmlDocumentContext );
case INTEGER -> cases.handleInteger( jaxbType, memberDetails, xmlDocumentContext );
case LONG -> cases.handleLong( jaxbType, memberDetails, xmlDocumentContext );
case DOUBLE -> cases.handleDouble( jaxbType, memberDetails, xmlDocumentContext );
case FLOAT -> cases.handleFloat( jaxbType, memberDetails, xmlDocumentContext );
case BIG_INTEGER -> cases.handleBigInteger( jaxbType, memberDetails, xmlDocumentContext );
case BIG_DECIMAL -> cases.handleBigDecimal( jaxbType, memberDetails, xmlDocumentContext );
case CHARACTER -> cases.handleCharacter( jaxbType, memberDetails, xmlDocumentContext );
case STRING -> cases.handleString( jaxbType, memberDetails, xmlDocumentContext );
case INSTANT -> cases.handleInstant( jaxbType, memberDetails, xmlDocumentContext );
case DURATION -> cases.handleDuration( jaxbType, memberDetails, xmlDocumentContext );
case YEAR -> cases.handleYear( jaxbType, memberDetails, xmlDocumentContext );
case LOCAL_DATE_TIME -> cases.handleLocalDateTime( jaxbType, memberDetails, xmlDocumentContext );
case LOCAL_DATE -> cases.handleLocalDate( jaxbType, memberDetails, xmlDocumentContext );
case LOCAL_TIME -> cases.handleLocalTime( jaxbType, memberDetails, xmlDocumentContext );
case OFFSET_DATE_TIME -> cases.handleOffsetDateTime( jaxbType, memberDetails, xmlDocumentContext );
case OFFSET_TIME -> cases.handleOffsetTime( jaxbType, memberDetails, xmlDocumentContext );
case ZONED_DATE_TIME -> cases.handleZonedDateTime( jaxbType, memberDetails, xmlDocumentContext );
case ZONE_ID -> cases.handleZoneId( jaxbType, memberDetails, xmlDocumentContext );
case ZONE_OFFSET -> cases.handleZoneOffset( jaxbType, memberDetails, xmlDocumentContext );
case UUID -> cases.handleUuid( jaxbType, memberDetails, xmlDocumentContext );
case URL -> cases.handleUrl( jaxbType, memberDetails, xmlDocumentContext );
case INET_ADDRESS -> cases.handleInetAddress( jaxbType, memberDetails, xmlDocumentContext );
case CURRENCY -> cases.handleCurrency( jaxbType, memberDetails, xmlDocumentContext );
case LOCALE -> cases.handleLocale( jaxbType, memberDetails, xmlDocumentContext );
case CLASS -> cases.handleClass( jaxbType, memberDetails, xmlDocumentContext );
case BLOB -> cases.handleBlob( jaxbType, memberDetails, xmlDocumentContext );
case CLOB -> cases.handleClob( jaxbType, memberDetails, xmlDocumentContext );
case NCLOB -> cases.handleNClob( jaxbType, memberDetails, xmlDocumentContext );
case JDBC_TIMESTAMP -> cases.handleTimestamp( jaxbType, memberDetails, xmlDocumentContext );
case JDBC_DATE -> cases.handleDate( jaxbType, memberDetails, xmlDocumentContext );
case JDBC_TIME -> cases.handleTime( jaxbType, memberDetails, xmlDocumentContext );
case CALENDAR -> cases.handleCalendar( jaxbType, memberDetails, xmlDocumentContext );
case TIME_ZONE -> cases.handleTimeZone( jaxbType, memberDetails, xmlDocumentContext );
}
}
@ -1076,6 +933,18 @@ public class XmlAnnotationHelper {
);
}
/**
* Used in cases where we might need to account for legacy "simple type naming" or "named basic types" such as
* {@code type="string"}.
*/
public static ClassDetails resolveSimpleJavaType(String value, ClassDetailsRegistry classDetailsRegistry) {
final SimpleTypeInterpretation simpleInterpretation = SimpleTypeInterpretation.interpret( value );
if ( simpleInterpretation != null ) {
return classDetailsRegistry.resolveClassDetails( simpleInterpretation.getJavaType().getName() );
}
return resolveJavaType( null, value, classDetailsRegistry );
}
public static ClassDetails resolveJavaType(String value, ClassDetailsRegistry classDetailsRegistry) {
return resolveJavaType( null, value, classDetailsRegistry );
}
@ -1224,7 +1093,7 @@ public class XmlAnnotationHelper {
}
public static void applyFilters(
List<JaxbHbmFilterImpl> jaxbFilters,
List<JaxbFilterImpl> jaxbFilters,
MutableAnnotationTarget target,
XmlDocumentContext xmlDocumentContext) {
if ( CollectionHelper.isEmpty( jaxbFilters ) ) {
@ -1248,7 +1117,7 @@ public class XmlAnnotationHelper {
}
public static void applyJoinTableFilters(
List<JaxbHbmFilterImpl> jaxbFilters,
List<JaxbFilterImpl> jaxbFilters,
MutableAnnotationTarget target,
XmlDocumentContext xmlDocumentContext) {
if ( CollectionHelper.isEmpty( jaxbFilters ) ) {

View File

@ -411,7 +411,7 @@
<xsd:element name="named-entity-graph" type="orm:named-entity-graph"
minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="filter" type="orm:hbm-filter" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="filter" type="orm:filter" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="fetch-profile" type="orm:fetch-profile" minOccurs="0" maxOccurs="unbounded" />
@ -1599,7 +1599,7 @@
<xsd:sequence>
<xsd:element name="join-table" type="orm:join-table" minOccurs="0"/>
<xsd:element name="sql-join-table-restriction" type="xsd:string" minOccurs="0"/>
<xsd:element name="filter-join-table" type="orm:hbm-filter" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="filter-join-table" type="orm:filter" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:choice>
@ -2034,7 +2034,7 @@
<xsd:sequence>
<xsd:element name="join-table" type="orm:join-table" minOccurs="0"/>
<xsd:element name="sql-join-table-restriction" type="xsd:string" minOccurs="0"/>
<xsd:element name="filter-join-table" type="orm:hbm-filter" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="filter-join-table" type="orm:filter" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
<xsd:sequence>
<xsd:element name="join-column" type="orm:join-column"
@ -2801,7 +2801,7 @@
<xsd:attribute name="apply-to-load-by-key" type="xsd:boolean" default="false"/>
</xsd:complexType>
<xsd:complexType name="hbm-filter">
<xsd:complexType name="filter">
<xsd:annotation>
<xsd:documentation>
Applies a filter defined by hbm-filter-def usage
@ -3308,7 +3308,7 @@
<xsd:element name="sql-delete" type="orm:custom-sql" minOccurs="0"/>
<xsd:element name="sql-delete-all" type="orm:custom-sql" minOccurs="0"/>
<xsd:element name="filter" type="orm:hbm-filter" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="filter" type="orm:filter" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:group>

View File

@ -177,7 +177,7 @@ public class XmlProcessingSmokeTests {
assertThat( amountFilter.getDefaultCondition() ).isEqualTo( "amount = :amount" );
assertThat( amountFilter.getParameterTypes() ).hasSize( 1 );
final ClassDetails amountParameterType = amountFilter.getParameterTypes().get( "amount" );
assertThat( amountParameterType.getClassName() ).isEqualTo( int.class.getName() );
assertThat( amountParameterType.getClassName() ).isEqualTo( Integer.class.getName() );
final FilterDefRegistration nameFilter = filterDefRegistrations.get( "name_filter" );
assertThat( nameFilter.getDefaultCondition() ).isEqualTo( "name = :name" );