package org.jboss.windup.reporting.freemarker; import java.util.List; import freemarker.ext.beans.StringModel; import freemarker.template.SimpleScalar; import org.jboss.windup.config.GraphRewrite; import freemarker.template.TemplateModelException; import java.util.logging.Logger; import org.jboss.windup.graph.model.ProjectModel; import org.jboss.windup.graph.traversal.AllTraversalStrategy; import org.jboss.windup.graph.traversal.OnlyOnceTraversalStrategy; import org.jboss.windup.graph.traversal.ProjectModelTraversal; import org.jboss.windup.graph.traversal.SharedLibsTraversalStrategy; import org.jboss.windup.graph.traversal.TraversalStrategy; import org.jboss.windup.util.ExecutionStatistics; /** * Gets a {@link ProjectModelTraversal} instance for the given {@link ProjectModel}. In order for this to be effective, * the project passed in should be a "root" project model. * * An optional parameter defines the traversal policy. * <ul> * <li>getProjectTraversal(project, 'only_once') - Only returns the first instance found of each project during traversal.</li> * <li>getProjectTraversal(project, 'all') - Returns all projects, including all duplicates.</li> * </ul> * * If nothing is specified, then the default is 'all'. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> * @author <a href="http://ondra.zizka.cz/">Ondrej Zizka, zizka@seznam.cz</a> */ public class GetProjectTraversalMethod implements WindupFreeMarkerMethod { public static final String NAME = "getProjectTraversal"; public static final String ONLY_ONCE = "only_once"; public static final String ALL = "all"; public static final String SHARED = "shared"; public String getMethodName() { return NAME; } @Override public String getDescription() { return "Gets a ProjectModelTraversal for the given ProjectModel. An optional parameter specifies the traversal " + "strategy ('" + ONLY_ONCE + "', '" + ALL + "' or '" + SHARED + "')."; } @Override public Object exec(List arguments) throws TemplateModelException { ExecutionStatistics.get().begin(NAME); if (arguments.size() < 1) { throw new TemplateModelException("Error, method expects at least one argument (" + ProjectModel.class.getSimpleName() + ")"); } StringModel stringModelArg = (StringModel) arguments.get(0); ProjectModel projectModel = (ProjectModel) stringModelArg.getWrappedObject(); String traversalStrategyString = ALL; if (arguments.size() > 1) traversalStrategyString = ((SimpleScalar)arguments.get(1)).getAsString(); TraversalStrategy traversalStrategy; if (traversalStrategyString == null) traversalStrategyString = ALL; switch (traversalStrategyString) { case ONLY_ONCE: traversalStrategy = new OnlyOnceTraversalStrategy(); break; case SHARED: traversalStrategy = new SharedLibsTraversalStrategy(); break; default: Logger.getLogger(GetProjectTraversalMethod.class.getName()).warning("Unknown strategy name: " + traversalStrategyString); case ALL: traversalStrategy = new AllTraversalStrategy(); break; } ProjectModelTraversal traversal = new ProjectModelTraversal(projectModel, traversalStrategy); ExecutionStatistics.get().end(NAME); return traversal; } }