@@ -669,43 +669,36 @@ private <T> boolean populateReadOnlyField(T pojo, ClassAttribute attribute,
669
669
670
670
LOG .debug ("Populating read-only field {}" , getter );
671
671
672
- Type [] genericTypeArgsAll ;
673
- Map <String , Type > paramTypeArgsMap ;
674
- Type genericPojoType = getter .getGenericReturnType ();
675
- if (genericPojoType instanceof ParameterizedType ) {
676
-
677
- paramTypeArgsMap = new HashMap <String , Type >(manufacturingCtx .getTypeArgsMap ());
678
-
679
- ParameterizedType paramType = (ParameterizedType ) genericPojoType ;
680
- Type [] actualTypes = paramType .getActualTypeArguments ();
681
- TypeManufacturerUtil .fillTypeArgMap (paramTypeArgsMap ,
682
- pojoType , actualTypes );
683
- genericTypeArgsAll = TypeManufacturerUtil .fillTypeArgMap (paramTypeArgsMap ,
684
- pojoType , genericTypeArgs );
685
-
686
- } else {
687
-
688
- paramTypeArgsMap = manufacturingCtx .getTypeArgsMap ();
689
- genericTypeArgsAll = genericTypeArgs ;
690
- }
691
-
692
- List <Annotation > pojoAttributeAnnotations =
693
- PodamUtils .getAttributeAnnotations (
694
- attribute .getAttribute (), getter );
695
-
696
672
Class <?> fieldClass = fieldValue .getClass ();
697
673
Integer depth = manufacturingCtx .getPojos ().get (fieldClass );
698
674
if (depth == null ) {
699
675
depth = 0 ;
700
676
}
701
677
if (depth < strategy .getMaxDepth (fieldClass )) {
702
678
703
- manufacturingCtx .backupTypeArgsMap (paramTypeArgsMap );
679
+ Type [] genericTypeArgsAll ;
680
+ Type genericPojoType = getter .getGenericReturnType ();
681
+ final boolean cloneTypeArgsMap = (genericPojoType instanceof ParameterizedType );
682
+ if (cloneTypeArgsMap ) {
683
+
684
+ genericTypeArgsAll = manufacturingCtx .cloneTypeArgsMap (
685
+ pojoType , (ParameterizedType ) genericPojoType , genericTypeArgs );
686
+ } else {
687
+
688
+ genericTypeArgsAll = genericTypeArgs ;
689
+ }
690
+
691
+ List <Annotation > pojoAttributeAnnotations =
692
+ PodamUtils .getAttributeAnnotations (
693
+ attribute .getAttribute (), getter );
694
+
704
695
manufacturingCtx .getPojos ().put (fieldClass , depth + 1 );
705
696
populatePojoInternal (fieldValue , pojoAttributeAnnotations ,
706
697
manufacturingCtx , genericTypeArgsAll );
707
698
manufacturingCtx .getPojos ().put (fieldClass , depth );
708
- manufacturingCtx .restoreTypeArgsMap ();
699
+ if (cloneTypeArgsMap ) {
700
+ manufacturingCtx .restoreTypeArgsMap ();
701
+ }
709
702
} else {
710
703
711
704
LOG .warn ("Loop of depth " + depth + " in filling read-only field {} detected." ,
@@ -1858,30 +1851,21 @@ private Object manufactureParameterValue(Class<?> pojoClass,
1858
1851
parameterType , annotations , attributeStrategy );
1859
1852
}
1860
1853
1861
- Map <String , Type > typeArgsMapForParam ;
1862
- if (genericType instanceof ParameterizedType ) {
1863
- typeArgsMapForParam = new HashMap <String , Type >(manufacturingCtx .getTypeArgsMap ());
1864
- ParameterizedType parametrizedType =
1865
- (ParameterizedType ) genericType ;
1866
-
1867
- TypeVariable <?>[] argumentTypes = parameterType .getTypeParameters ();
1868
- Type [] argumentGenericTypes = parametrizedType .getActualTypeArguments ();
1869
-
1870
- for (int k = 0 ; k < argumentTypes .length ; k ++) {
1871
- if (argumentGenericTypes [k ] instanceof Class ) {
1872
- Class <?> genericParam = (Class <?>) argumentGenericTypes [k ];
1873
- typeArgsMapForParam .put (argumentTypes [k ].getName (), genericParam );
1874
- }
1875
- }
1854
+ final boolean cloneTypeArgsMap = (genericType instanceof ParameterizedType );
1855
+ Type [] genericTypeArgsAll ;
1856
+ if (cloneTypeArgsMap ) {
1857
+ genericTypeArgsAll = manufacturingCtx .cloneTypeArgsMap (
1858
+ parameterType , (ParameterizedType ) genericType , genericTypeArgs );
1876
1859
} else {
1877
- typeArgsMapForParam = manufacturingCtx . getTypeArgsMap () ;
1860
+ genericTypeArgsAll = genericTypeArgs ;
1878
1861
}
1879
1862
1880
- manufacturingCtx .backupTypeArgsMap (typeArgsMapForParam );
1881
1863
Object retValue = manufactureAttributeValue (pojoClass , manufacturingCtx , parameterType ,
1882
1864
genericType , annotations , parameterName ,
1883
- genericTypeArgs );
1884
- manufacturingCtx .restoreTypeArgsMap ();
1865
+ genericTypeArgsAll );
1866
+ if (cloneTypeArgsMap ) {
1867
+ manufacturingCtx .restoreTypeArgsMap ();
1868
+ }
1885
1869
return retValue ;
1886
1870
}
1887
1871
0 commit comments