Skip to content

Commit f753197

Browse files
committed
Backup and create typeArgsMap in ManufacturingContext
1 parent 46d99ab commit f753197

File tree

2 files changed

+46
-19
lines changed

2 files changed

+46
-19
lines changed

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

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ public class PodamFactoryImpl implements PodamFactory {
4747
/** Application logger */
4848
private static final Logger LOG = LoggerFactory.getLogger(PodamFactoryImpl.class);
4949

50-
/** Empty type map */
51-
private static final Map<String, Type> NULL_TYPE_ARGS_MAP = new HashMap<String, Type>();
52-
53-
5450
// ------------------->> Instance / variables
5551

5652
/**
@@ -480,8 +476,7 @@ private <T> T manufacturePojoInternal(Class<T> pojoClass,
480476
pojoClass, Arrays.toString(genericTypeArgs));
481477
}
482478

483-
Map<String, Type> typeArgsMap = manufacturingCtx.getTypeArgsMap();
484-
manufacturingCtx.setTypeArgsMap(new HashMap<String, Type>());
479+
manufacturingCtx.backupTypeArgsMap(manufacturingCtx.createEmptyTypeArgsMap());
485480
Type[] genericTypeArgsExtra = TypeManufacturerUtil.fillTypeArgMap(
486481
manufacturingCtx.getTypeArgsMap(), pojoClass, genericTypeArgs);
487482

@@ -514,7 +509,7 @@ private <T> T manufacturePojoInternal(Class<T> pojoClass,
514509
genericTypeArgsExtra);
515510
}
516511

517-
manufacturingCtx.setTypeArgsMap(typeArgsMap);
512+
manufacturingCtx.restoreTypeArgsMap();
518513
return retValue;
519514
}
520515

@@ -705,13 +700,12 @@ private <T> boolean populateReadOnlyField(T pojo, ClassAttribute attribute,
705700
}
706701
if (depth < strategy.getMaxDepth(fieldClass)) {
707702

708-
Map<String, Type> typeArgsMap = manufacturingCtx.getTypeArgsMap();
709-
manufacturingCtx.setTypeArgsMap(paramTypeArgsMap);
703+
manufacturingCtx.backupTypeArgsMap(paramTypeArgsMap);
710704
manufacturingCtx.getPojos().put(fieldClass, depth + 1);
711705
populatePojoInternal(fieldValue, pojoAttributeAnnotations,
712706
manufacturingCtx, genericTypeArgsAll);
713707
manufacturingCtx.getPojos().put(fieldClass, depth);
714-
manufacturingCtx.setTypeArgsMap(typeArgsMap);
708+
manufacturingCtx.restoreTypeArgsMap();
715709
} else {
716710

717711
LOG.warn("Loop of depth " + depth + " in filling read-only field {} detected.",
@@ -1221,12 +1215,11 @@ private void fillCollection(ManufacturingContext manufacturingCtx,
12211215

12221216
if (null == element) {
12231217

1224-
final Map<String, Type> typeArgsMap = manufacturingCtx.getTypeArgsMap();
1225-
manufacturingCtx.setTypeArgsMap(NULL_TYPE_ARGS_MAP);
1218+
manufacturingCtx.backupTypeArgsMap(manufacturingCtx.createEmptyTypeArgsMap());
12261219
element = manufactureAttributeValue(collection, manufacturingCtx,
12271220
collectionElementType, collectionElementType,
12281221
annotations, attributeName, genericTypeArgs);
1229-
manufacturingCtx.setTypeArgsMap(typeArgsMap);
1222+
manufacturingCtx.restoreTypeArgsMap();
12301223
}
12311224

12321225
if (null != element) {
@@ -1549,8 +1542,7 @@ private Object getMapKeyOrElementValue(
15491542

15501543
if (null == retValue) {
15511544

1552-
final Map<String, Type> typeArgsMap = manufacturingCtx.getTypeArgsMap();
1553-
manufacturingCtx.setTypeArgsMap(NULL_TYPE_ARGS_MAP);
1545+
manufacturingCtx.backupTypeArgsMap(manufacturingCtx.createEmptyTypeArgsMap());
15541546
retValue = manufactureAttributeValue(
15551547
keyOrElementsArguments.getMapToBeFilled(),
15561548
manufacturingCtx,
@@ -1559,7 +1551,7 @@ private Object getMapKeyOrElementValue(
15591551
keyOrElementsArguments.getAnnotations(),
15601552
keyOrElementsArguments.getAttributeName(),
15611553
keyOrElementsArguments.getGenericTypeArgs());
1562-
manufacturingCtx.setTypeArgsMap(typeArgsMap);
1554+
manufacturingCtx.restoreTypeArgsMap();
15631555
}
15641556
return retValue;
15651557
}
@@ -1885,12 +1877,11 @@ private Object manufactureParameterValue(Class<?> pojoClass,
18851877
typeArgsMapForParam = manufacturingCtx.getTypeArgsMap();
18861878
}
18871879

1888-
final Map<String, Type> typeArgsMap = manufacturingCtx.getTypeArgsMap();
1889-
manufacturingCtx.setTypeArgsMap(typeArgsMapForParam);
1880+
manufacturingCtx.backupTypeArgsMap(typeArgsMapForParam);
18901881
Object retValue = manufactureAttributeValue(pojoClass, manufacturingCtx, parameterType,
18911882
genericType, annotations, parameterName,
18921883
genericTypeArgs);
1893-
manufacturingCtx.setTypeArgsMap(typeArgsMap);
1884+
manufacturingCtx.restoreTypeArgsMap();
18941885
return retValue;
18951886
}
18961887

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

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

33
import java.lang.reflect.Type;
4+
import java.util.ArrayDeque;
5+
import java.util.Deque;
46
import java.util.HashMap;
57
import java.util.Map;
68

@@ -25,6 +27,11 @@ public class ManufacturingContext {
2527
* example) with their actual types */
2628
private Map<String, Type> typeArgsMap = new HashMap<String, Type>();
2729

30+
/** Backup stack of maps relating the generic class arguments ("&lt;T, V&gt;" for
31+
* example) with their actual types */
32+
/** Constructors sorting order */
33+
private Deque<Map<String, Type>> backupTypeArgsMaps = new ArrayDeque<Map<String, Type>>();
34+
2835
/**
2936
* Getter for constructor ordering
3037
* @return constructor ordering
@@ -68,4 +75,33 @@ public Map<String, Type> getTypeArgsMap() {
6875
public void setTypeArgsMap(Map<String, Type> typeArgsMap) {
6976
this.typeArgsMap = typeArgsMap;
7077
}
78+
79+
/**
80+
* Creates an empty typeArgsMap
81+
* @return newly created map
82+
*/
83+
public Map<String, Type> createEmptyTypeArgsMap() {
84+
return new HashMap<String, Type>();
85+
}
86+
87+
/**
88+
* Backups typeArgsMap and replace it with a new one
89+
* @param typeArgsMap
90+
* relating the generic class arguments ("&lt;T, V&gt;" for
91+
* example) with their actual types
92+
*/
93+
public void backupTypeArgsMap(Map<String, Type> typeArgsMap) {
94+
backupTypeArgsMaps.push(this.typeArgsMap);
95+
this.typeArgsMap = typeArgsMap;
96+
}
97+
98+
/**
99+
* Restores typeArgsMap from backup
100+
* @return previous map
101+
*/
102+
public Map<String, Type> restoreTypeArgsMap() {
103+
final Map<String, Type> oldTypeArgsMap = this.typeArgsMap;
104+
this.typeArgsMap = backupTypeArgsMaps.pop();
105+
return oldTypeArgsMap;
106+
}
71107
}

0 commit comments

Comments
 (0)