package org.jboss.windup.rules.apps.java.reporting.freemarker; import java.util.List; import org.jboss.windup.reporting.freemarker.WindupFreeMarkerMethod; import org.jboss.windup.util.ExecutionStatistics; import org.jboss.windup.util.exception.WindupException; import freemarker.core.CollectionAndSequence; import freemarker.ext.beans.BeanModel; import freemarker.template.DefaultListAdapter; import freemarker.template.SimpleSequence; import freemarker.template.TemplateModelException; /** * Returns whether an Iterable has values within it. * * Called as follows: * * getPrettyPathForFile(Iterable) * * @author <a href="mailto:bradsdavis@gmail.com">Brad Davis</a> * */ public class IterableHasContent implements WindupFreeMarkerMethod { private static final String NAME = "iterableHasContent"; @Override public Object exec(@SuppressWarnings("rawtypes") List arguments) throws TemplateModelException { ExecutionStatistics.get().begin(NAME); try { if (arguments.size() != 1) { throw new TemplateModelException("Error, method expects one argument (Iterable)"); } return hasContent(arguments.get(0)); } finally { ExecutionStatistics.get().end(NAME); } } private boolean hasContent(Object arg) throws TemplateModelException { if (arg instanceof BeanModel) { BeanModel beanModel = (BeanModel) arg; return ((Iterable) beanModel.getWrappedObject()).iterator().hasNext(); } else if (arg instanceof SimpleSequence) { SimpleSequence simpleSequence = (SimpleSequence) arg; return simpleSequence.toList().size() > 0; } else if (arg instanceof DefaultListAdapter) { DefaultListAdapter defaultListAdapter = (DefaultListAdapter) arg; return defaultListAdapter.size() > 0; } else if (arg instanceof CollectionAndSequence) { CollectionAndSequence sequence = (CollectionAndSequence)arg; return sequence.size() > 0; } else { throw new WindupException("Unrecognized type passed to: " + getMethodName() + ": " + arg.getClass().getCanonicalName()); } } @Override public String getMethodName() { return NAME; } @Override public String getDescription() { return "Takes an Iterable as a parameter and checks to see whether items exist in the Iterable."; } }