private void fillValueWithMetadata( final TemplateTree tree, final ValueNode root, final Object metadata, final Map<String, Set<Object>> excluded, final boolean prune, final boolean overwrite) throws ParseException { final List<ValueNode> children = new ArrayList<>(root.children); for (ValueNode node : children) { final ValueNode origNode = new ValueNode(node); final Object obj = getValue(node, metadata, excluded, overwrite); if (obj instanceof Collection && !((Collection) obj).isEmpty()) { final Iterator it = ((Collection) obj).iterator(); int i = node.ordinal; while (it.hasNext()) { Object child = it.next(); node = tree.duplicateNode(origNode, i); if (node.isField()) { node.value = valueToString(node, child, !prune, overwrite); } else { fillValueWithMetadata(tree, node, child, excluded, prune, overwrite); } i++; } } else { if (node.isField()) { node.value = valueToString(node, obj, !prune, overwrite); } else { fillValueWithMetadata(tree, node, obj, excluded, prune, overwrite); } } } }