Skip to content

Commit 787a320

Browse files
committed
more work on ConverterDescriptors
this is a lot cleaner now
1 parent b181afe commit 787a320

29 files changed

+360
-270
lines changed

hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.hibernate.boot.model.TypeDefinition;
2424
import org.hibernate.boot.model.TypeDefinitionRegistry;
2525
import org.hibernate.boot.model.convert.internal.AttributeConverterManager;
26-
import org.hibernate.boot.model.convert.internal.ClassBasedConverterDescriptor;
26+
import org.hibernate.boot.model.convert.internal.ConverterDescriptors;
2727
import org.hibernate.boot.model.convert.spi.ConverterAutoApplyHandler;
2828
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
2929
import org.hibernate.boot.model.convert.spi.ConverterRegistry;
@@ -569,20 +569,13 @@ private ClassmateContext getClassmateContext() {
569569
@Override
570570
public void addAttributeConverter(Class<? extends AttributeConverter<?, ?>> converterClass) {
571571
attributeConverterManager.addConverter(
572-
new ClassBasedConverterDescriptor<>( converterClass, getClassmateContext() )
573-
);
572+
ConverterDescriptors.of( converterClass, null, false, getClassmateContext() ) );
574573
}
575574

576575
@Override
577576
public void addOverridableConverter(Class<? extends AttributeConverter<?, ?>> converterClass) {
578577
attributeConverterManager.addConverter(
579-
new ClassBasedConverterDescriptor<>( converterClass, getClassmateContext() ) {
580-
@Override
581-
public boolean overrideable() {
582-
return true;
583-
}
584-
}
585-
);
578+
ConverterDescriptors.of( converterClass, null, true, getClassmateContext() ) );
586579
}
587580

588581
@Override

hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@
3333
import org.hibernate.boot.model.FunctionContributor;
3434
import org.hibernate.boot.model.TypeContributions;
3535
import org.hibernate.boot.model.TypeContributor;
36-
import org.hibernate.boot.model.convert.internal.ClassBasedConverterDescriptor;
37-
import org.hibernate.boot.model.convert.internal.InstanceBasedConverterDescriptor;
36+
import org.hibernate.boot.model.convert.internal.ConverterDescriptors;
3837
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
3938
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
4039
import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl;
@@ -326,7 +325,7 @@ public TypeConfiguration getTypeConfiguration() {
326325
@Override
327326
public void contributeAttributeConverter(Class<? extends AttributeConverter<?,?>> converterClass) {
328327
bootstrapContext.addAttributeConverterDescriptor(
329-
new ClassBasedConverterDescriptor<>( converterClass, bootstrapContext.getClassmateContext() )
328+
ConverterDescriptors.of( converterClass, bootstrapContext.getClassmateContext() )
330329
);
331330
}
332331

@@ -389,35 +388,32 @@ public MetadataBuilder applyAttributeConverter(ConverterDescriptor<?,?> descript
389388
@Override
390389
public <O,R> MetadataBuilder applyAttributeConverter(Class<? extends AttributeConverter<O,R>> attributeConverterClass) {
391390
bootstrapContext.addAttributeConverterDescriptor(
392-
new ClassBasedConverterDescriptor<>( attributeConverterClass, bootstrapContext.getClassmateContext() )
391+
ConverterDescriptors.of( attributeConverterClass, bootstrapContext.getClassmateContext() )
393392
);
394393
return this;
395394
}
396395

397396
@Override
398397
public <O,R> MetadataBuilder applyAttributeConverter(Class<? extends AttributeConverter<O,R>> attributeConverterClass, boolean autoApply) {
399398
bootstrapContext.addAttributeConverterDescriptor(
400-
new ClassBasedConverterDescriptor<>(
401-
attributeConverterClass,
402-
autoApply,
403-
bootstrapContext.getClassmateContext()
404-
)
399+
ConverterDescriptors.of( attributeConverterClass, autoApply, false,
400+
bootstrapContext.getClassmateContext() )
405401
);
406402
return this;
407403
}
408404

409405
@Override
410406
public <O,R> MetadataBuilder applyAttributeConverter(AttributeConverter<O,R> attributeConverter) {
411407
bootstrapContext.addAttributeConverterDescriptor(
412-
new InstanceBasedConverterDescriptor( attributeConverter, bootstrapContext.getClassmateContext() )
408+
ConverterDescriptors.of( attributeConverter, bootstrapContext.getClassmateContext() )
413409
);
414410
return this;
415411
}
416412

417413
@Override
418414
public MetadataBuilder applyAttributeConverter(AttributeConverter<?,?> attributeConverter, boolean autoApply) {
419415
bootstrapContext.addAttributeConverterDescriptor(
420-
new InstanceBasedConverterDescriptor( attributeConverter, autoApply, bootstrapContext.getClassmateContext() )
416+
ConverterDescriptors.of( attributeConverter, autoApply, bootstrapContext.getClassmateContext() )
421417
);
422418
return this;
423419
}

hibernate-core/src/main/java/org/hibernate/boot/model/convert/internal/AbstractConverterDescriptor.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
*/
55
package org.hibernate.boot.model.convert.internal;
66

7-
import java.util.List;
8-
97
import org.hibernate.boot.spi.ClassmateContext;
108
import org.hibernate.boot.model.convert.spi.AutoApplicableConverterDescriptor;
119
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
@@ -23,25 +21,22 @@
2321
/**
2422
* @author Steve Ebersole
2523
*/
26-
public abstract class AbstractConverterDescriptor<X,Y> implements ConverterDescriptor<X,Y> {
27-
private final Class<? extends AttributeConverter<? extends X,? extends Y>> converterClass;
24+
abstract class AbstractConverterDescriptor<X,Y> implements ConverterDescriptor<X,Y> {
25+
private final Class<? extends AttributeConverter<X,Y>> converterClass;
2826

2927
private final ResolvedType domainType;
3028
private final ResolvedType jdbcType;
3129

3230
private final AutoApplicableConverterDescriptor autoApplicableDescriptor;
3331

34-
public AbstractConverterDescriptor(
35-
Class<? extends AttributeConverter<? extends X, ? extends Y>> converterClass,
32+
AbstractConverterDescriptor(
33+
Class<? extends AttributeConverter<X, Y>> converterClass,
3634
Boolean forceAutoApply,
3735
ClassmateContext classmateContext) {
3836
this.converterClass = converterClass;
39-
40-
final List<ResolvedType> converterParamTypes =
41-
resolveConverterClassParamTypes( converterClass, classmateContext );
37+
final var converterParamTypes = resolveConverterClassParamTypes( converterClass, classmateContext );
4238
domainType = converterParamTypes.get( 0 );
4339
jdbcType = converterParamTypes.get( 1 );
44-
4540
autoApplicableDescriptor = resolveAutoApplicableDescriptor( converterClass, forceAutoApply );
4641
}
4742

@@ -66,7 +61,7 @@ private static boolean isAutoApply(Class<? extends AttributeConverter<?, ?>> con
6661
}
6762

6863
@Override
69-
public Class<? extends AttributeConverter<? extends X,? extends Y>> getAttributeConverterClass() {
64+
public Class<? extends AttributeConverter<X,Y>> getAttributeConverterClass() {
7065
return converterClass;
7166
}
7267

@@ -88,8 +83,7 @@ public AutoApplicableConverterDescriptor getAutoApplyDescriptor() {
8883
@Override
8984
public JpaAttributeConverter<X,Y> createJpaAttributeConverter(JpaAttributeConverterCreationContext context) {
9085
return new JpaAttributeConverterImpl<>(
91-
(ManagedBean<? extends AttributeConverter<X,Y>>)
92-
createManagedBean( context ),
86+
createManagedBean( context ),
9387
context.getJavaTypeRegistry().getDescriptor( converterClass ),
9488
getDomainClass(),
9589
getRelationalClass(),
@@ -107,6 +101,6 @@ private Class<X> getDomainClass() {
107101
return (Class<X>) getDomainValueResolvedType().getErasedType();
108102
}
109103

110-
protected abstract ManagedBean<? extends AttributeConverter<? extends X,? extends Y>>
104+
protected abstract ManagedBean<? extends AttributeConverter<X,Y>>
111105
createManagedBean(JpaAttributeConverterCreationContext context);
112106
}

hibernate-core/src/main/java/org/hibernate/boot/model/convert/internal/AttributeConverterManager.java

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import java.util.ArrayList;
88
import java.util.Collection;
9-
import java.util.Collections;
109
import java.util.List;
1110
import java.util.Locale;
1211
import java.util.Map;
@@ -27,6 +26,7 @@
2726

2827
import com.fasterxml.classmate.ResolvedType;
2928

29+
import static java.util.Collections.emptyList;
3030
import static org.hibernate.boot.model.convert.internal.ConverterHelper.resolveAttributeType;
3131
import static org.hibernate.boot.model.convert.internal.ConverterHelper.resolveConverterClassParamTypes;
3232
import static org.hibernate.internal.util.StringHelper.join;
@@ -91,16 +91,7 @@ public void addRegistration(RegisteredConversion conversion, BootstrapContext co
9191
registeredConversionsByDomainType = new ConcurrentHashMap<>();
9292
}
9393

94-
final Class<?> domainType;
95-
if ( conversion.getExplicitDomainType().equals( void.class ) ) {
96-
// the registration did not define an explicit domain-type, so inspect the converter
97-
final List<ResolvedType> converterParamTypes =
98-
resolveConverterClassParamTypes( conversion.getConverterType(), context.getClassmateContext() );
99-
domainType = converterParamTypes.get( 0 ).getErasedType();
100-
}
101-
else {
102-
domainType = conversion.getExplicitDomainType();
103-
}
94+
final Class<?> domainType = getDomainType( conversion, context );
10495

10596
// make sure we are not overriding a previous conversion registration
10697
final RegisteredConversion existingRegistration =
@@ -132,26 +123,35 @@ public void addRegistration(RegisteredConversion conversion, BootstrapContext co
132123
registeredConversionsByDomainType.put( domainType, conversion );
133124
}
134125

135-
private Collection<ConverterDescriptor<?,?>> converterDescriptors() {
136-
if ( attributeConverterDescriptorsByClass == null ) {
137-
return Collections.emptyList();
126+
private static Class<?> getDomainType(RegisteredConversion conversion, BootstrapContext context) {
127+
if ( conversion.getExplicitDomainType().equals( void.class ) ) {
128+
// the registration did not define an explicit domain-type, so inspect the converter
129+
final List<ResolvedType> converterParamTypes =
130+
resolveConverterClassParamTypes( conversion.getConverterType(), context.getClassmateContext() );
131+
return converterParamTypes.get( 0 ).getErasedType();
132+
}
133+
else {
134+
return conversion.getExplicitDomainType();
138135
}
139-
return attributeConverterDescriptorsByClass.values();
140136
}
141137

142-
enum ConversionSite {
143-
ATTRIBUTE( "basic attribute" ),
144-
COLLECTION_ELEMENT( "collection attribute's element" ),
145-
MAP_KEY( "map attribute's key" );
146-
147-
private final String siteDescriptor;
138+
private Collection<ConverterDescriptor<?,?>> converterDescriptors() {
139+
return attributeConverterDescriptorsByClass == null
140+
? emptyList()
141+
: attributeConverterDescriptorsByClass.values();
142+
}
148143

149-
ConversionSite(String siteDescriptor) {
150-
this.siteDescriptor = siteDescriptor;
151-
}
144+
enum ConversionSite {
145+
ATTRIBUTE,
146+
COLLECTION_ELEMENT,
147+
MAP_KEY;
152148

153149
public String getSiteDescriptor() {
154-
return siteDescriptor;
150+
return switch ( this ) {
151+
case ATTRIBUTE -> "basic attribute";
152+
case COLLECTION_ELEMENT -> "collection attribute's element";
153+
case MAP_KEY -> "map attribute's key";
154+
};
155155
}
156156
}
157157

@@ -193,18 +193,16 @@ private static ConverterDescriptor<?,?> pickUniqueMatch(
193193
MemberDetails memberDetails,
194194
ConversionSite conversionSite,
195195
List<ConverterDescriptor<?,?>> matches) {
196-
switch ( matches.size() ) {
197-
case 0:
198-
return null;
199-
case 1:
200-
return matches.get( 0 );
201-
default:
202-
final List<ConverterDescriptor<?,?>> filtered =
196+
return switch ( matches.size() ) {
197+
case 0 -> null;
198+
case 1 -> matches.get( 0 );
199+
default -> {
200+
final var filtered =
203201
matches.stream()
204202
.filter( match -> !match.overrideable() )
205203
.toList();
206204
if ( filtered.size() == 1 ) {
207-
return filtered.get( 0 );
205+
yield filtered.get( 0 );
208206
}
209207
else {
210208
// otherwise, we had multiple matches
@@ -219,7 +217,8 @@ private static ConverterDescriptor<?,?> pickUniqueMatch(
219217
)
220218
);
221219
}
222-
}
220+
}
221+
};
223222
}
224223

225224
private List<ConverterDescriptor<?,?>> getMatches(

hibernate-core/src/main/java/org/hibernate/boot/model/convert/internal/ClassBasedConverterDescriptor.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,26 @@
1616
*
1717
* @author Steve Ebersole
1818
*/
19-
public class ClassBasedConverterDescriptor<X,Y> extends AbstractConverterDescriptor<X,Y> {
19+
class ClassBasedConverterDescriptor<X,Y> extends AbstractConverterDescriptor<X,Y> {
2020

21-
public ClassBasedConverterDescriptor(
22-
Class<? extends AttributeConverter<? extends X,? extends Y>> converterClass,
23-
ClassmateContext classmateContext) {
24-
super( converterClass, null, classmateContext );
25-
}
21+
private final boolean overrideable;
2622

27-
public ClassBasedConverterDescriptor(
28-
Class<? extends AttributeConverter<? extends X,? extends Y>> converterClass,
23+
ClassBasedConverterDescriptor(
24+
Class<? extends AttributeConverter<X,Y>> converterClass,
2925
Boolean forceAutoApply,
30-
ClassmateContext classmateContext) {
26+
ClassmateContext classmateContext,
27+
boolean overrideable) {
3128
super( converterClass, forceAutoApply, classmateContext );
29+
this.overrideable = overrideable;
30+
}
31+
32+
@Override
33+
public boolean overrideable() {
34+
return overrideable;
3235
}
3336

3437
@Override
35-
protected ManagedBean<? extends AttributeConverter<? extends X, ? extends Y>>
38+
protected ManagedBean<? extends AttributeConverter<X,Y>>
3639
createManagedBean(JpaAttributeConverterCreationContext context) {
3740
return context.getManagedBeanRegistry().getBean( getAttributeConverterClass() );
3841
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.boot.model.convert.internal;
6+
7+
import com.fasterxml.classmate.ResolvedType;
8+
import jakarta.persistence.AttributeConverter;
9+
import org.hibernate.boot.model.convert.spi.AutoApplicableConverterDescriptor;
10+
import org.hibernate.boot.model.convert.spi.ConverterDescriptor;
11+
import org.hibernate.boot.model.convert.spi.JpaAttributeConverterCreationContext;
12+
import org.hibernate.type.descriptor.converter.internal.JpaAttributeConverterImpl;
13+
import org.hibernate.type.descriptor.converter.spi.JpaAttributeConverter;
14+
import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
15+
16+
class ConverterDescriptorImpl<X, Y> implements ConverterDescriptor<X, Y> {
17+
private final Class<? extends AttributeConverter<X, Y>> converterType;
18+
private final ResolvedType domainTypeToMatch;
19+
private final ResolvedType relationalType;
20+
private final AutoApplicableConverterDescriptor autoApplyDescriptor;
21+
22+
ConverterDescriptorImpl(
23+
Class<? extends AttributeConverter<X, Y>> converterType,
24+
ResolvedType domainTypeToMatch,
25+
ResolvedType relationalType,
26+
boolean autoApply) {
27+
this.converterType = converterType;
28+
this.domainTypeToMatch = domainTypeToMatch;
29+
this.relationalType = relationalType;
30+
this.autoApplyDescriptor = autoApply
31+
? new AutoApplicableConverterDescriptorStandardImpl( this )
32+
: AutoApplicableConverterDescriptorBypassedImpl.INSTANCE;
33+
}
34+
35+
@Override
36+
public Class<? extends AttributeConverter<X, Y>> getAttributeConverterClass() {
37+
return converterType;
38+
}
39+
40+
@Override
41+
public ResolvedType getDomainValueResolvedType() {
42+
return domainTypeToMatch;
43+
}
44+
45+
@Override
46+
public ResolvedType getRelationalValueResolvedType() {
47+
return relationalType;
48+
}
49+
50+
@Override
51+
public AutoApplicableConverterDescriptor getAutoApplyDescriptor() {
52+
return autoApplyDescriptor;
53+
}
54+
55+
@Override
56+
public JpaAttributeConverter<X, Y> createJpaAttributeConverter(JpaAttributeConverterCreationContext context) {
57+
final JavaTypeRegistry javaTypeRegistry = context.getTypeConfiguration().getJavaTypeRegistry();
58+
final var converterBean = context.getManagedBeanRegistry().getBean( converterType );
59+
return new JpaAttributeConverterImpl<>(
60+
converterBean,
61+
javaTypeRegistry.getDescriptor( converterBean.getBeanClass() ),
62+
javaTypeRegistry.resolveDescriptor( domainTypeToMatch.getErasedType() ),
63+
javaTypeRegistry.resolveDescriptor( relationalType.getErasedType() )
64+
);
65+
}
66+
}

0 commit comments

Comments
 (0)