61
61
import java .util .Set ;
62
62
import java .util .concurrent .ConcurrentHashMap ;
63
63
import java .util .stream .Collectors ;
64
- import java .util .stream .IntStream ;
65
- import java .util .stream .Stream ;
66
64
67
65
import org .springframework .beans .BeanUtils ;
68
66
import org .springframework .core .MethodParameter ;
@@ -94,15 +92,15 @@ public class NewTypeDiscoverer<S> implements TypeInformation<S> {
94
92
MAP_TYPES = mapTypes .toArray (new Class [0 ]);
95
93
}
96
94
97
- private ResolvableType type ;
95
+ ResolvableType resolvableType ;
98
96
private Map <String , Optional <TypeInformation <?>>> fields = new ConcurrentHashMap <>();
99
97
100
98
private final Lazy <TypeInformation <?>> componentType ;
101
99
private final Lazy <TypeInformation <?>> valueType ;
102
100
103
101
public NewTypeDiscoverer (ResolvableType type ) {
104
102
105
- this .type = type ;
103
+ this .resolvableType = type ;
106
104
this .componentType = Lazy .of (this ::doGetComponentType );
107
105
this .valueType = Lazy .of (this ::doGetMapValueType );
108
106
}
@@ -139,15 +137,15 @@ public TypeInformation<?> getProperty(String name) {
139
137
140
138
private Optional <TypeInformation <?>> getPropertyInformation (String fieldname ) {
141
139
142
- Class <?> rawType = type .toClass ();
140
+ Class <?> rawType = resolvableType .toClass ();
143
141
var field = ReflectionUtils .findField (rawType , fieldname );
144
142
145
143
if (field != null ) {
146
- return Optional .of (new NewTypeDiscoverer (ResolvableType .forField (field , type )));
144
+ return Optional .of (new NewTypeDiscoverer (ResolvableType .forField (field , resolvableType )));
147
145
}
148
146
149
147
return findPropertyDescriptor (rawType , fieldname ).map (it -> {
150
- return new NewTypeDiscoverer (ResolvableType .forType (it .getPropertyType (), type ));
148
+ return new NewTypeDiscoverer (ResolvableType .forType (it .getPropertyType (), resolvableType ));
151
149
});
152
150
}
153
151
@@ -191,23 +189,23 @@ protected TypeInformation<?> doGetComponentType() {
191
189
var rawType = getType ();
192
190
193
191
if (rawType .isArray ()) {
194
- return new NewTypeDiscoverer <>(type .getComponentType ());
192
+ return new NewTypeDiscoverer <>(resolvableType .getComponentType ());
195
193
}
196
194
197
195
if (isMap ()) {
198
196
if (ClassUtils .isAssignable (Map .class , rawType )) {
199
- ResolvableType mapValueType = type .asMap ().getGeneric (0 );
197
+ ResolvableType mapValueType = resolvableType .asMap ().getGeneric (0 );
200
198
if (ResolvableType .NONE .equals (mapValueType )) {
201
199
return null ;
202
200
}
203
201
204
202
return mapValueType != null ? new NewTypeDiscoverer (mapValueType ) : new ClassTypeInformation <>(Object .class );
205
203
}
206
- if (type .hasGenerics ()) {
207
- ResolvableType mapValueType = type .getGeneric (0 );
204
+ if (resolvableType .hasGenerics ()) {
205
+ ResolvableType mapValueType = resolvableType .getGeneric (0 );
208
206
return mapValueType != null ? new NewTypeDiscoverer (mapValueType ) : new ClassTypeInformation <>(Object .class );
209
207
}
210
- return Arrays .stream (type .getInterfaces ()).filter (ResolvableType ::hasGenerics )
208
+ return Arrays .stream (resolvableType .getInterfaces ()).filter (ResolvableType ::hasGenerics )
211
209
.findFirst ()
212
210
.map (it -> it .getGeneric (0 ))
213
211
.map (NewTypeDiscoverer ::new )
@@ -216,16 +214,16 @@ protected TypeInformation<?> doGetComponentType() {
216
214
217
215
if (Iterable .class .isAssignableFrom (rawType )) {
218
216
219
- ResolvableType mapValueType = type .as (Iterable .class ).getGeneric (0 );
217
+ ResolvableType mapValueType = resolvableType .as (Iterable .class ).getGeneric (0 );
220
218
if (ResolvableType .NONE .equals (mapValueType ) ) {
221
219
return null ;
222
220
}
223
- if (type .hasGenerics ()) {
224
- mapValueType = type .getGeneric (0 );
221
+ if (resolvableType .hasGenerics ()) {
222
+ mapValueType = resolvableType .getGeneric (0 );
225
223
return mapValueType != null ? new NewTypeDiscoverer (mapValueType ) : new ClassTypeInformation <>(Object .class );
226
224
}
227
225
228
- return Arrays .stream (type .getInterfaces ()).filter (ResolvableType ::hasGenerics )
226
+ return Arrays .stream (resolvableType .getInterfaces ()).filter (ResolvableType ::hasGenerics )
229
227
.findFirst ()
230
228
.map (it -> it .getGeneric (0 ))
231
229
.filter (it -> !ResolvableType .NONE .equals (it ))
@@ -241,15 +239,15 @@ protected TypeInformation<?> doGetComponentType() {
241
239
}
242
240
243
241
if (isNullableWrapper ()) {
244
- ResolvableType mapValueType = type .getGeneric (0 );
242
+ ResolvableType mapValueType = resolvableType .getGeneric (0 );
245
243
if (ResolvableType .NONE .equals (mapValueType ) ) {
246
244
return null ;
247
245
}
248
246
return mapValueType != null ? new NewTypeDiscoverer (mapValueType ) : new ClassTypeInformation <>(Object .class );
249
247
}
250
248
251
- if (type .hasGenerics ()) {
252
- ResolvableType mapValueType = type .getGeneric (0 );
249
+ if (resolvableType .hasGenerics ()) {
250
+ ResolvableType mapValueType = resolvableType .getGeneric (0 );
253
251
return mapValueType != null ? new NewTypeDiscoverer (mapValueType ) : new ClassTypeInformation <>(Object .class );
254
252
}
255
253
@@ -285,28 +283,28 @@ protected TypeInformation<?> doGetMapValueType() {
285
283
286
284
if (isMap ()) {
287
285
if (ClassUtils .isAssignable (Map .class , getType ())) {
288
- ResolvableType mapValueType = type .asMap ().getGeneric (1 );
286
+ ResolvableType mapValueType = resolvableType .asMap ().getGeneric (1 );
289
287
if (ResolvableType .NONE .equals (mapValueType )) {
290
288
return null ;
291
289
}
292
290
293
291
return mapValueType != null ? new NewTypeDiscoverer (mapValueType ) : new ClassTypeInformation <>(Object .class );
294
292
}
295
- if (type .hasGenerics ()) {
296
- ResolvableType mapValueType = type .getGeneric (1 );
293
+ if (resolvableType .hasGenerics ()) {
294
+ ResolvableType mapValueType = resolvableType .getGeneric (1 );
297
295
return mapValueType != null ? new NewTypeDiscoverer (mapValueType ) : new ClassTypeInformation <>(Object .class );
298
296
}
299
- return Arrays .stream (type .getInterfaces ()).filter (ResolvableType ::hasGenerics )
297
+ return Arrays .stream (resolvableType .getInterfaces ()).filter (ResolvableType ::hasGenerics )
300
298
.findFirst ()
301
299
.map (it -> it .getGeneric (1 ))
302
300
.map (NewTypeDiscoverer ::new )
303
301
.orElse (null );
304
302
}
305
303
306
- if (!type .hasGenerics ()) {
304
+ if (!resolvableType .hasGenerics ()) {
307
305
return null ;
308
306
}
309
- ResolvableType x = Arrays .stream (type .getGenerics ()).skip (1 ).findFirst ().orElse (null );
307
+ ResolvableType x = Arrays .stream (resolvableType .getGenerics ()).skip (1 ).findFirst ().orElse (null );
310
308
if (x == null || ResolvableType .NONE .equals (x )) {
311
309
return null ;
312
310
}
@@ -316,12 +314,12 @@ protected TypeInformation<?> doGetMapValueType() {
316
314
317
315
@ Override
318
316
public Class <S > getType () {
319
- return (Class <S >) type .toClass ();
317
+ return (Class <S >) resolvableType .toClass ();
320
318
}
321
319
322
320
@ Override
323
321
public ClassTypeInformation <?> getRawTypeInformation () {
324
- return new ClassTypeInformation <>(this .type .getRawClass ());
322
+ return new ClassTypeInformation <>(this .resolvableType .getRawClass ());
325
323
}
326
324
327
325
@ Nullable
@@ -353,7 +351,7 @@ public TypeInformation<?> getReturnType(Method method) {
353
351
public List <TypeInformation <?>> getParameterTypes (Method method ) {
354
352
355
353
return Streamable .of (method .getParameters ()).stream ().map (MethodParameter ::forParameter )
356
- .map (it -> ResolvableType .forMethodParameter (it , type )).map (NewTypeDiscoverer ::new )
354
+ .map (it -> ResolvableType .forMethodParameter (it , resolvableType )).map (NewTypeDiscoverer ::new )
357
355
.collect (Collectors .toList ());
358
356
359
357
}
@@ -374,28 +372,28 @@ public TypeInformation<?> getSuperTypeInformation(Class<?> superType) {
374
372
375
373
List <ResolvableType > candidates = new ArrayList <>();
376
374
377
- ResolvableType genericSuperclass = type .getSuperType ();
375
+ ResolvableType genericSuperclass = resolvableType .getSuperType ();
378
376
if (genericSuperclass != null ) {
379
377
candidates .add (genericSuperclass );
380
378
}
381
379
382
- candidates .addAll (Arrays .asList (type .getInterfaces ()));
380
+ candidates .addAll (Arrays .asList (resolvableType .getInterfaces ()));
383
381
384
382
for (var candidate : candidates ) {
385
383
if (ObjectUtils .nullSafeEquals (superType , candidate .toClass ())) {
386
384
return new NewTypeDiscoverer (candidate );
387
385
} else {
388
386
var sup = candidate .getSuperType ();
389
387
if (sup != null && !ResolvableType .NONE .equals (sup )) {
390
- if (sup .equals (type )) {
388
+ if (sup .equals (resolvableType )) {
391
389
return this ;
392
390
}
393
391
return new NewTypeDiscoverer (sup );
394
392
}
395
393
}
396
394
}
397
395
398
- return new NewTypeDiscoverer (type .as (superType ));
396
+ return new NewTypeDiscoverer (resolvableType .as (superType ));
399
397
}
400
398
401
399
@ Override
@@ -410,7 +408,7 @@ public boolean isAssignableFrom(TypeInformation<?> target) {
410
408
return true ;
411
409
}
412
410
413
- if (type .isAssignableFrom (target .getType ())) {
411
+ if (resolvableType .isAssignableFrom (target .getType ())) {
414
412
return true ;
415
413
}
416
414
@@ -420,14 +418,26 @@ public boolean isAssignableFrom(TypeInformation<?> target) {
420
418
@ Override
421
419
public List <TypeInformation <?>> getTypeArguments () {
422
420
423
- if (!type .hasGenerics ()) {
421
+ if (!resolvableType .hasGenerics ()) {
424
422
return Collections .emptyList ();
425
423
}
426
- return Arrays .stream (type .getGenerics ()).map (NewTypeDiscoverer ::new ).collect (Collectors .toList ());
424
+ return Arrays .stream (resolvableType .getGenerics ()).map (NewTypeDiscoverer ::new ).collect (Collectors .toList ());
427
425
}
428
426
429
427
@ Override
430
428
public TypeInformation <? extends S > specialize (ClassTypeInformation <?> type ) {
429
+ // if(isAssignableFrom(type)) {
430
+ // return new ClassTypeInformation(type.getType());
431
+ // }
432
+ // return new NewTypeDiscoverer(type.resolvableType.as(getType()));
433
+ // if(type.resolvableType.isAssignableFrom(type.resolvableType)) {
434
+ // return (TypeInformation<? extends S>) type;
435
+ // }
436
+
437
+ if (this .resolvableType .getGenerics ().length == type .resolvableType .getGenerics ().length ) {
438
+ return new NewTypeDiscoverer <>(ResolvableType .forClassWithGenerics (type .getType (), this .resolvableType .getGenerics ()));
439
+ }
440
+
431
441
return new ClassTypeInformation (type .getType ());
432
442
}
433
443
@@ -438,12 +448,12 @@ public boolean equals(Object o) {
438
448
439
449
NewTypeDiscoverer <?> that = (NewTypeDiscoverer <?>) o ;
440
450
441
- if (!ObjectUtils .nullSafeEquals (type .getType (), that .type .getType ())) {
451
+ if (!ObjectUtils .nullSafeEquals (resolvableType .getType (), that .resolvableType .getType ())) {
442
452
return false ;
443
453
}
444
454
445
- List <? extends Class <?>> collect1 = Arrays .stream (type .getGenerics ()).map (ResolvableType ::toClass ).collect (Collectors .toList ());
446
- List <? extends Class <?>> collect2 = Arrays .stream (that .type .getGenerics ()).map (ResolvableType ::toClass ).collect (Collectors .toList ());
455
+ List <? extends Class <?>> collect1 = Arrays .stream (resolvableType .getGenerics ()).map (ResolvableType ::toClass ).collect (Collectors .toList ());
456
+ List <? extends Class <?>> collect2 = Arrays .stream (that .resolvableType .getGenerics ()).map (ResolvableType ::toClass ).collect (Collectors .toList ());
447
457
448
458
if (!ObjectUtils .nullSafeEquals (collect1 , collect2 )) {
449
459
return false ;
@@ -453,7 +463,7 @@ public boolean equals(Object o) {
453
463
454
464
@ Override
455
465
public int hashCode () {
456
- return ObjectUtils .nullSafeHashCode (type .toClass ());
466
+ return ObjectUtils .nullSafeHashCode (resolvableType .toClass ());
457
467
}
458
468
459
469
@ Override
0 commit comments