@@ -669,43 +669,36 @@ private <T> boolean populateReadOnlyField(T pojo, ClassAttribute attribute,
669669
670670 LOG .debug ("Populating read-only field {}" , getter );
671671
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-
696672 Class <?> fieldClass = fieldValue .getClass ();
697673 Integer depth = manufacturingCtx .getPojos ().get (fieldClass );
698674 if (depth == null ) {
699675 depth = 0 ;
700676 }
701677 if (depth < strategy .getMaxDepth (fieldClass )) {
702678
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+
704695 manufacturingCtx .getPojos ().put (fieldClass , depth + 1 );
705696 populatePojoInternal (fieldValue , pojoAttributeAnnotations ,
706697 manufacturingCtx , genericTypeArgsAll );
707698 manufacturingCtx .getPojos ().put (fieldClass , depth );
708- manufacturingCtx .restoreTypeArgsMap ();
699+ if (cloneTypeArgsMap ) {
700+ manufacturingCtx .restoreTypeArgsMap ();
701+ }
709702 } else {
710703
711704 LOG .warn ("Loop of depth " + depth + " in filling read-only field {} detected." ,
@@ -1858,30 +1851,21 @@ private Object manufactureParameterValue(Class<?> pojoClass,
18581851 parameterType , annotations , attributeStrategy );
18591852 }
18601853
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 );
18761859 } else {
1877- typeArgsMapForParam = manufacturingCtx . getTypeArgsMap () ;
1860+ genericTypeArgsAll = genericTypeArgs ;
18781861 }
18791862
1880- manufacturingCtx .backupTypeArgsMap (typeArgsMapForParam );
18811863 Object retValue = manufactureAttributeValue (pojoClass , manufacturingCtx , parameterType ,
18821864 genericType , annotations , parameterName ,
1883- genericTypeArgs );
1884- manufacturingCtx .restoreTypeArgsMap ();
1865+ genericTypeArgsAll );
1866+ if (cloneTypeArgsMap ) {
1867+ manufacturingCtx .restoreTypeArgsMap ();
1868+ }
18851869 return retValue ;
18861870 }
18871871
0 commit comments