@@ -34,7 +34,7 @@ public class JavaTypeRegistry implements JavaTypeBaseline.BaselineTarget, Serial
3434 private static final Logger log = Logger .getLogger ( JavaTypeRegistry .class );
3535
3636 private final TypeConfiguration typeConfiguration ;
37- private final ConcurrentHashMap <Type , JavaType <?>> descriptorsByType = new ConcurrentHashMap <>();
37+ private final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName = new ConcurrentHashMap <>();
3838
3939 public JavaTypeRegistry (TypeConfiguration typeConfiguration ) {
4040 this .typeConfiguration = typeConfiguration ;
@@ -56,7 +56,7 @@ public void addBaselineDescriptor(JavaType<?> descriptor) {
5656 @ Override
5757 public void addBaselineDescriptor (Type describedJavaType , JavaType <?> descriptor ) {
5858 performInjections ( descriptor );
59- descriptorsByType .put ( describedJavaType , descriptor );
59+ descriptorsByTypeName .put ( describedJavaType . getTypeName () , descriptor );
6060 }
6161
6262 private void performInjections (JavaType <?> descriptor ) {
@@ -71,15 +71,15 @@ private void performInjections(JavaType<?> descriptor) {
7171 // descriptor access
7272
7373 public void forEachDescriptor (Consumer <JavaType <?>> consumer ) {
74- descriptorsByType .values ().forEach ( consumer );
74+ descriptorsByTypeName .values ().forEach ( consumer );
7575 }
7676
7777 public <T > JavaType <T > getDescriptor (Type javaType ) {
7878 return resolveDescriptor ( javaType );
7979 }
8080
8181 public void addDescriptor (JavaType <?> descriptor ) {
82- JavaType <?> old = descriptorsByType .put ( descriptor .getJavaType (), descriptor );
82+ JavaType <?> old = descriptorsByTypeName .put ( descriptor .getJavaType (). getTypeName (), descriptor );
8383 if ( old != null ) {
8484 log .debugf (
8585 "JavaTypeRegistry entry replaced : %s -> %s (was %s)" ,
@@ -93,74 +93,84 @@ public void addDescriptor(JavaType<?> descriptor) {
9393
9494 public <J > JavaType <J > findDescriptor (Type javaType ) {
9595 //noinspection unchecked
96- return (JavaType <J >) descriptorsByType .get ( javaType );
96+ return (JavaType <J >) descriptorsByTypeName .get ( javaType . getTypeName () );
9797 }
9898
9999 public <J > JavaType <J > resolveDescriptor (Type javaType , Supplier <JavaType <J >> creator ) {
100- final JavaType <?> cached = descriptorsByType .get ( javaType );
100+ return resolveDescriptor ( javaType .getTypeName (), creator );
101+ }
102+
103+ private <J > JavaType <J > resolveDescriptor (String javaTypeName , Supplier <JavaType <J >> creator ) {
104+ final JavaType <?> cached = descriptorsByTypeName .get ( javaTypeName );
101105 if ( cached != null ) {
102106 //noinspection unchecked
103107 return (JavaType <J >) cached ;
104108 }
105109
106110 final JavaType <J > created = creator .get ();
107- descriptorsByType .put ( javaType , created );
111+ descriptorsByTypeName .put ( javaTypeName , created );
108112 return created ;
109113 }
110114
111115 public <J > JavaType <J > resolveDescriptor (Type javaType ) {
112- return resolveDescriptor ( javaType , (elementJavaType , typeConfiguration ) -> {
113- final MutabilityPlan <J > determinedPlan = RegistryHelper .INSTANCE .determineMutabilityPlan (
114- elementJavaType ,
115- typeConfiguration
116- );
117- if ( determinedPlan != null ) {
118- return determinedPlan ;
119- }
116+ return resolveDescriptor ( javaType , JavaTypeRegistry ::createMutabilityPlan );
117+ }
118+
119+ private static <J > MutabilityPlan <?> createMutabilityPlan (Type elementJavaType , TypeConfiguration typeConfiguration ) {
120+ final MutabilityPlan <J > determinedPlan = RegistryHelper .INSTANCE .determineMutabilityPlan (
121+ elementJavaType ,
122+ typeConfiguration
123+ );
124+ if ( determinedPlan != null ) {
125+ return determinedPlan ;
126+ }
127+
128+ return MutableMutabilityPlan .INSTANCE ;
129+ }
120130
121- return MutableMutabilityPlan .INSTANCE ;
122- } );
131+ public JavaType <?> resolveArrayDescriptor (Class <?> elementJavaType ) {
132+ return resolveDescriptor ( elementJavaType .getTypeName () + "[]" ,
133+ () -> createArrayTypeDescriptor ( elementJavaType , JavaTypeRegistry ::createMutabilityPlan ) );
123134 }
124135
125136 public <J > JavaType <J > resolveDescriptor (
126137 Type javaType ,
127138 BiFunction <Type , TypeConfiguration , MutabilityPlan <?>> mutabilityPlanCreator ) {
128139 return resolveDescriptor (
129- javaType ,
140+ javaType . getTypeName () ,
130141 () -> {
131142 if ( javaType instanceof ParameterizedType parameterizedType ) {
132143 final JavaType <J > rawType = findDescriptor ( parameterizedType .getRawType () );
133144 if ( rawType != null ) {
134145 return rawType .createJavaType ( parameterizedType , typeConfiguration );
135146 }
136147 }
137- final Type elementJavaType ;
138- JavaType <J > elementTypeDescriptor ;
139- if ( javaType instanceof Class <?> && ( (Class <?>) javaType ).isArray () ) {
140- elementJavaType = ( (Class <?>) javaType ).getComponentType ();
141- elementTypeDescriptor = findDescriptor ( elementJavaType );
142- }
143- else {
144- elementJavaType = javaType ;
145- elementTypeDescriptor = null ;
146- }
147- if ( elementTypeDescriptor == null ) {
148- //noinspection unchecked
149- elementTypeDescriptor = RegistryHelper .INSTANCE .createTypeDescriptor (
150- elementJavaType ,
151- () -> (MutabilityPlan <J >) mutabilityPlanCreator .apply ( elementJavaType , typeConfiguration ),
152- typeConfiguration
153- );
154- }
155- if ( javaType != elementJavaType ) {
148+ else if ( javaType instanceof Class <?> javaClass && javaClass .isArray () ) {
156149 //noinspection unchecked
157- return (JavaType <J >) new ArrayJavaType <>( elementTypeDescriptor );
150+ return (JavaType <J >) createArrayTypeDescriptor ( javaClass . getComponentType (), mutabilityPlanCreator );
158151 }
159- return elementTypeDescriptor ;
152+ return createTypeDescriptor ( javaType , mutabilityPlanCreator ) ;
160153 }
161154 );
162155 }
163156
157+ private <J > JavaType <J []> createArrayTypeDescriptor (Class <J > elementJavaType , BiFunction <Type , TypeConfiguration , MutabilityPlan <?>> mutabilityPlanCreator ) {
158+ JavaType <J > elementTypeDescriptor = findDescriptor ( elementJavaType );
159+ if ( elementTypeDescriptor == null ) {
160+ elementTypeDescriptor = createTypeDescriptor ( elementJavaType , mutabilityPlanCreator );
161+ }
162+ return new ArrayJavaType <>( elementTypeDescriptor );
163+ }
164+
165+ private <J > JavaType <J > createTypeDescriptor (Type javaType , BiFunction <Type , TypeConfiguration , MutabilityPlan <?>> mutabilityPlanCreator ) {
166+ //noinspection unchecked
167+ return RegistryHelper .INSTANCE .createTypeDescriptor (
168+ javaType ,
169+ () -> (MutabilityPlan <J >) mutabilityPlanCreator .apply ( javaType , typeConfiguration ),
170+ typeConfiguration
171+ );
172+ }
173+
164174 public <J > JavaType <J > resolveManagedTypeDescriptor (Type javaType ) {
165175 return resolveManagedTypeDescriptor ( javaType , false );
166176 }
0 commit comments