private void addListElement(final ClassLoader loader, final Function<Supplier<Object>, Object> contextualSupplier, final Map<String, Object> config, final String prefix, final Map<String, Object> preparedObjects, final String nestedName, final String listName, final ParameterizedType pt, final Supplier<?> init, final List<ParameterMeta> metas) { final Collection<Object> aggregator = Collection.class.cast(preparedObjects.computeIfAbsent(listName, k -> init.get())); final Class<?> itemType = Class.class.cast(pt.getActualTypeArguments()[0]); final int index = Integer.parseInt(nestedName.substring(listName.length() + 1, nestedName.length() - 1)); if (aggregator.size() <= index) { aggregator .add(createObject(loader, contextualSupplier, itemType, findArgsName(itemType), prefix + nestedName, config, metas)); } }
private BiFunction<String, Map<String, Object>, Object> createObjectFactory(final ClassLoader loader, final Function<Supplier<Object>, Object> contextualSupplier, final Type type, final List<ParameterMeta> metas) { final Class clazz = Class.class.cast(type); if (clazz.isPrimitive() || Primitives.unwrap(clazz) != clazz || String.class == clazz) { return (name, config) -> doConvert(clazz, config.get(name)); } if (clazz.isEnum()) { return (name, config) -> ofNullable(config.get(name)) .map(String.class::cast) .map(String::trim) .filter(it -> !it.isEmpty()) .map(v -> Enum.valueOf(clazz, v)) .orElse(null); } final String[] args = findArgsName(clazz); return (name, config) -> contextualSupplier .apply(() -> createObject(loader, contextualSupplier, clazz, args, name, config, metas)); }
args = findArgsName(itemClass);
preparedObjects .put(nestedName, createObject(loader, contextualSupplier, field.getType(), findArgsName(field.getType()), prefix + nestedName, config, translate(metas, nestedName)));