Skip to content

Commit 0e2c5be

Browse files
committed
Minor refactoring
Avoid creating a map for a nested list. See gh-280
1 parent fc1e05b commit 0e2c5be

File tree

1 file changed

+32
-29
lines changed

1 file changed

+32
-29
lines changed

spring-graphql/src/main/java/org/springframework/graphql/data/GraphQlArgumentBinder.java

+32-29
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.lang.reflect.Constructor;
2020
import java.util.Collection;
2121
import java.util.Collections;
22-
import java.util.HashMap;
2322
import java.util.List;
2423
import java.util.Map;
2524
import java.util.Optional;
@@ -222,14 +221,11 @@ private Object createValue(
222221
// Default constructor with data binding
223222

224223
if (ctor.getParameterCount() == 0) {
225-
MutablePropertyValues mpvs = new MutablePropertyValues();
226-
visitArgumentMap(rawMap, mpvs, new Stack<>());
227-
228224
target = BeanUtils.instantiateClass(ctor);
229225
DataBinder dataBinder = new DataBinder(target);
230226
dataBinder.getBindingResult().setNestedPath(toArgumentPath(segments));
231227
dataBinder.setConversionService(getConversionService());
232-
dataBinder.bind(mpvs);
228+
dataBinder.bind(initBindValues(rawMap));
233229

234230
if (dataBinder.getBindingResult().hasErrors()) {
235231
addErrors(dataBinder, bindingResult, segments);
@@ -284,35 +280,42 @@ else if (rawValue instanceof Map) {
284280
}
285281
}
286282

287-
@SuppressWarnings("unchecked")
288-
private void visitArgumentMap(Map<String, Object> rawMap, MutablePropertyValues mpvs, Stack<String> segments) {
283+
private MutablePropertyValues initBindValues(Map<String, Object> rawMap) {
284+
MutablePropertyValues mpvs = new MutablePropertyValues();
285+
Stack<String> segments = new Stack<>();
289286
for (String key : rawMap.keySet()) {
290-
Object rawValue = rawMap.get(key);
291-
if (rawValue instanceof List) {
292-
List<Object> items = (List<Object>) rawValue;
293-
if (items.isEmpty()) {
294-
segments.push(key);
295-
mpvs.add(toArgumentPath(segments), rawValue);
296-
segments.pop();
297-
}
298-
else {
299-
Map<String, Object> subValues = new HashMap<>(items.size());
300-
for (int i = 0; i < items.size(); i++) {
301-
subValues.put(key + "[" + i + "]", items.get(i));
302-
}
303-
visitArgumentMap(subValues, mpvs, segments);
304-
}
305-
}
306-
else if (rawValue instanceof Map) {
307-
segments.push(key + ".");
308-
visitArgumentMap((Map<String, Object>) rawValue, mpvs, segments);
287+
addBindValues(mpvs, key, rawMap.get(key), segments);
288+
}
289+
return mpvs;
290+
}
291+
292+
@SuppressWarnings("unchecked")
293+
private void addBindValues(MutablePropertyValues mpvs, String name, Object value, Stack<String> segments) {
294+
if (value instanceof List) {
295+
List<Object> items = (List<Object>) value;
296+
if (items.isEmpty()) {
297+
segments.push(name);
298+
mpvs.add(toArgumentPath(segments), value);
309299
segments.pop();
310300
}
311301
else {
312-
segments.push(key);
313-
mpvs.add(toArgumentPath(segments), rawValue);
314-
segments.pop();
302+
for (int i = 0; i < items.size(); i++) {
303+
addBindValues(mpvs, name + "[" + i + "]", items.get(i), segments);
304+
}
305+
}
306+
}
307+
else if (value instanceof Map) {
308+
segments.push(name + ".");
309+
Map<String, Object> map = (Map<String, Object>) value;
310+
for (String key : map.keySet()) {
311+
addBindValues(mpvs, key, map.get(key), segments);
315312
}
313+
segments.pop();
314+
}
315+
else {
316+
segments.push(name);
317+
mpvs.add(toArgumentPath(segments), value);
318+
segments.pop();
316319
}
317320
}
318321

0 commit comments

Comments
 (0)