Skip to content

Commit c81f36d

Browse files
committed
Encapsulate typeArgsMap in ManufacturingContext
1 parent f753197 commit c81f36d

File tree

2 files changed

+57
-45
lines changed

2 files changed

+57
-45
lines changed

src/main/java/uk/co/jemos/podam/api/PodamFactoryImpl.java

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/main/java/uk/co/jemos/podam/common/ManufacturingContext.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package uk.co.jemos.podam.common;
22

3+
import java.lang.reflect.ParameterizedType;
34
import java.lang.reflect.Type;
45
import java.util.ArrayDeque;
56
import java.util.Deque;
67
import java.util.HashMap;
78
import java.util.Map;
89

910
import uk.co.jemos.podam.api.DataProviderStrategy.Order;
11+
import uk.co.jemos.podam.typeManufacturers.TypeManufacturerUtil;
1012

1113
/**
1214
* Object to hold manufacturing related data
@@ -84,6 +86,32 @@ public Map<String, Type> createEmptyTypeArgsMap() {
8486
return new HashMap<String, Type>();
8587
}
8688

89+
/**
90+
* Clones and backups typeArgsMap and fills it with types for a new POJO
91+
* @param pojoType
92+
* class of a new POJO
93+
* @param parameterizedPojoType
94+
* parameterized type of a new POJO
95+
* @param genericTypeArgs
96+
* The generic type arguments for the current generic class
97+
* instance
98+
* @return
99+
* The updated generic type arguments for the current generic class
100+
* instance
101+
*/
102+
public Type[] cloneTypeArgsMap(Class<?> pojoType,
103+
ParameterizedType parameterizedPojoType,
104+
Type[] genericTypeArgs) {
105+
backupTypeArgsMaps.push(typeArgsMap);
106+
typeArgsMap = new HashMap<String, Type>(typeArgsMap);
107+
108+
Type[] actualTypes = parameterizedPojoType.getActualTypeArguments();
109+
TypeManufacturerUtil.fillTypeArgMap(typeArgsMap,
110+
pojoType, actualTypes);
111+
return TypeManufacturerUtil.fillTypeArgMap(typeArgsMap,
112+
pojoType, genericTypeArgs);
113+
}
114+
87115
/**
88116
* Backups typeArgsMap and replace it with a new one
89117
* @param typeArgsMap

0 commit comments

Comments
 (0)