package org.molgenis.ui.freemarker;
import com.google.common.collect.Lists;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.Version;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
public class MolgenisFreemarkerObjectWrapper extends DefaultObjectWrapper
{
public MolgenisFreemarkerObjectWrapper(Version incompatibleImprovements)
{
super(incompatibleImprovements);
}
@Override
protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException
{
if (obj instanceof Iterable<?>)
{
// Fix for https://github.com/molgenis/molgenis/issues/4227
// If a method returning an Iterable in some cases returns a List and in other cases a e.g. FluentIterable
// then it is unclear whether <#list iterable> or <#list iterable.iterator()> should be used.
obj = Lists.newArrayList(((Iterable<?>) obj));
}
else if (obj instanceof Stream<?>)
{
obj = ((Stream<?>) obj).collect(toList());
}
return super.handleUnknownType(obj);
}
}