|
67 | 67 | import java.util.NoSuchElementException; |
68 | 68 | import java.util.ResourceBundle; |
69 | 69 | import java.util.Set; |
| 70 | +import java.util.SortedSet; |
70 | 71 | import java.util.TreeMap; |
| 72 | +import java.util.TreeSet; |
71 | 73 | import java.util.UUID; |
72 | 74 |
|
73 | 75 | import static org.httprpc.kilo.util.Collections.*; |
@@ -1256,52 +1258,39 @@ private Object[] getArguments(Parameter[] parameters, List<String> keys, Map<Str |
1256 | 1258 | var name = coalesce(map(parameter.getAnnotation(Name.class), Name::value), parameter::getName); |
1257 | 1259 | var type = parameter.getType(); |
1258 | 1260 |
|
1259 | | - var values = argumentMap.get(name); |
| 1261 | + var values = coalesce(argumentMap.get(name), () -> emptyListOf(Object.class)); |
1260 | 1262 |
|
1261 | 1263 | Object argument; |
1262 | 1264 | if (type.isArray()) { |
1263 | 1265 | var componentType = type.getComponentType(); |
1264 | 1266 |
|
1265 | | - if (values != null) { |
1266 | | - argument = Array.newInstance(componentType, values.size()); |
| 1267 | + argument = Array.newInstance(componentType, values.size()); |
1267 | 1268 |
|
1268 | | - var j = 0; |
| 1269 | + var j = 0; |
1269 | 1270 |
|
1270 | | - for (var value : values) { |
1271 | | - Array.set(argument, j++, BeanAdapter.coerce(value, componentType)); |
1272 | | - } |
1273 | | - } else { |
1274 | | - argument = Array.newInstance(componentType, 0); |
| 1271 | + for (var value : values) { |
| 1272 | + Array.set(argument, j++, BeanAdapter.coerce(value, componentType)); |
1275 | 1273 | } |
1276 | 1274 | } else if (Collection.class.isAssignableFrom(type)) { |
1277 | 1275 | var parameterizedType = (ParameterizedType)parameter.getParameterizedType(); |
1278 | 1276 | var elementType = (Class<?>)parameterizedType.getActualTypeArguments()[0]; |
1279 | 1277 |
|
1280 | | - var size = coalesce(map(values, List::size), () -> 0); |
1281 | | - |
1282 | 1278 | Collection<Object> collection; |
1283 | 1279 | if (type == List.class) { |
1284 | | - collection = new ArrayList<>(size); |
1285 | | - } else if (type == Set.class) { |
1286 | | - collection = new LinkedHashSet<>(size); |
| 1280 | + collection = new ArrayList<>(values.size()); |
| 1281 | + } else if (Set.class.isAssignableFrom(type)) { |
| 1282 | + collection = (type == SortedSet.class) ? new TreeSet<>() : new LinkedHashSet<>(values.size()); |
1287 | 1283 | } else { |
1288 | 1284 | throw new UnsupportedOperationException("Unsupported collection type."); |
1289 | 1285 | } |
1290 | 1286 |
|
1291 | | - if (values != null) { |
1292 | | - for (var element : values) { |
1293 | | - collection.add(BeanAdapter.coerce(element, elementType)); |
1294 | | - } |
| 1287 | + for (var value : values) { |
| 1288 | + collection.add(BeanAdapter.coerce(value, elementType)); |
1295 | 1289 | } |
1296 | 1290 |
|
1297 | 1291 | argument = collection; |
1298 | 1292 | } else { |
1299 | | - Object value; |
1300 | | - if (values != null) { |
1301 | | - value = values.getLast(); |
1302 | | - } else { |
1303 | | - value = null; |
1304 | | - } |
| 1293 | + var value = values.isEmpty() ? null : values.getLast(); |
1305 | 1294 |
|
1306 | 1295 | if (parameter.getAnnotation(Required.class) != null && value == null) { |
1307 | 1296 | throw new IllegalArgumentException(String.format("Parameter \"%s\" is required.", parameter.getName())); |
|
0 commit comments