@@ -34,7 +34,7 @@ public class JavaTypeRegistry implements JavaTypeBaseline.BaselineTarget, Serial
34
34
private static final Logger log = Logger .getLogger ( JavaTypeRegistry .class );
35
35
36
36
private final TypeConfiguration typeConfiguration ;
37
- private final ConcurrentHashMap <Type , JavaType <?>> descriptorsByType = new ConcurrentHashMap <>();
37
+ private final ConcurrentHashMap <String , JavaType <?>> descriptorsByTypeName = new ConcurrentHashMap <>();
38
38
39
39
public JavaTypeRegistry (TypeConfiguration typeConfiguration ) {
40
40
this .typeConfiguration = typeConfiguration ;
@@ -56,7 +56,7 @@ public void addBaselineDescriptor(JavaType<?> descriptor) {
56
56
@ Override
57
57
public void addBaselineDescriptor (Type describedJavaType , JavaType <?> descriptor ) {
58
58
performInjections ( descriptor );
59
- descriptorsByType .put ( describedJavaType , descriptor );
59
+ descriptorsByTypeName .put ( describedJavaType . getTypeName () , descriptor );
60
60
}
61
61
62
62
private void performInjections (JavaType <?> descriptor ) {
@@ -71,15 +71,15 @@ private void performInjections(JavaType<?> descriptor) {
71
71
// descriptor access
72
72
73
73
public void forEachDescriptor (Consumer <JavaType <?>> consumer ) {
74
- descriptorsByType .values ().forEach ( consumer );
74
+ descriptorsByTypeName .values ().forEach ( consumer );
75
75
}
76
76
77
77
public <T > JavaType <T > getDescriptor (Type javaType ) {
78
78
return resolveDescriptor ( javaType );
79
79
}
80
80
81
81
public void addDescriptor (JavaType <?> descriptor ) {
82
- JavaType <?> old = descriptorsByType .put ( descriptor .getJavaType (), descriptor );
82
+ JavaType <?> old = descriptorsByTypeName .put ( descriptor .getJavaType (). getTypeName (), descriptor );
83
83
if ( old != null ) {
84
84
log .debugf (
85
85
"JavaTypeRegistry entry replaced : %s -> %s (was %s)" ,
@@ -93,74 +93,84 @@ public void addDescriptor(JavaType<?> descriptor) {
93
93
94
94
public <J > JavaType <J > findDescriptor (Type javaType ) {
95
95
//noinspection unchecked
96
- return (JavaType <J >) descriptorsByType .get ( javaType );
96
+ return (JavaType <J >) descriptorsByTypeName .get ( javaType . getTypeName () );
97
97
}
98
98
99
99
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 );
101
105
if ( cached != null ) {
102
106
//noinspection unchecked
103
107
return (JavaType <J >) cached ;
104
108
}
105
109
106
110
final JavaType <J > created = creator .get ();
107
- descriptorsByType .put ( javaType , created );
111
+ descriptorsByTypeName .put ( javaTypeName , created );
108
112
return created ;
109
113
}
110
114
111
115
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
+ }
120
130
121
- return MutableMutabilityPlan .INSTANCE ;
122
- } );
131
+ public JavaType <?> resolveArrayDescriptor (Class <?> elementJavaType ) {
132
+ return resolveDescriptor ( elementJavaType .getTypeName () + "[]" ,
133
+ () -> createArrayTypeDescriptor ( elementJavaType , JavaTypeRegistry ::createMutabilityPlan ) );
123
134
}
124
135
125
136
public <J > JavaType <J > resolveDescriptor (
126
137
Type javaType ,
127
138
BiFunction <Type , TypeConfiguration , MutabilityPlan <?>> mutabilityPlanCreator ) {
128
139
return resolveDescriptor (
129
- javaType ,
140
+ javaType . getTypeName () ,
130
141
() -> {
131
142
if ( javaType instanceof ParameterizedType parameterizedType ) {
132
143
final JavaType <J > rawType = findDescriptor ( parameterizedType .getRawType () );
133
144
if ( rawType != null ) {
134
145
return rawType .createJavaType ( parameterizedType , typeConfiguration );
135
146
}
136
147
}
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 () ) {
156
149
//noinspection unchecked
157
- return (JavaType <J >) new ArrayJavaType <>( elementTypeDescriptor );
150
+ return (JavaType <J >) createArrayTypeDescriptor ( javaClass . getComponentType (), mutabilityPlanCreator );
158
151
}
159
- return elementTypeDescriptor ;
152
+ return createTypeDescriptor ( javaType , mutabilityPlanCreator ) ;
160
153
}
161
154
);
162
155
}
163
156
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
+
164
174
public <J > JavaType <J > resolveManagedTypeDescriptor (Type javaType ) {
165
175
return resolveManagedTypeDescriptor ( javaType , false );
166
176
}
0 commit comments