package org.jboss.windup.rules.apps.java.reporting.freemarker.filepath; import java.util.List; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.model.resource.ReportResourceFileModel; import org.jboss.windup.reporting.freemarker.WindupFreeMarkerMethod; import org.jboss.windup.rules.apps.java.model.JavaClassFileModel; import org.jboss.windup.rules.apps.java.model.JavaSourceFileModel; import org.jboss.windup.util.ExecutionStatistics; import freemarker.ext.beans.StringModel; import freemarker.template.TemplateModelException; /** * A template pattern: An abstract class implementing a template method exec for multiple path generators. * In order to provide a new path generator from Model, extend this class and implement all the abstract methods. */ public abstract class AbstractGetPrettyPathForFile implements WindupFreeMarkerMethod { private static final String NAME = "abstractGetPrettyPathForFile"; @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 (FileModel)"); } StringModel stringModelArg = (StringModel) arguments.get(0); FileModel fileModel = (FileModel) stringModelArg.getWrappedObject(); if (fileModel instanceof JavaClassFileModel) { return getPath((JavaClassFileModel) fileModel); } else if (fileModel instanceof ReportResourceFileModel) { return getPath((ReportResourceFileModel) fileModel); } else if (fileModel instanceof JavaSourceFileModel) { return getPath((JavaSourceFileModel) fileModel); } else { return getPath(fileModel); } } finally { ExecutionStatistics.get().end(NAME); } } public abstract String getPath(JavaClassFileModel jcfm); public abstract String getPath(ReportResourceFileModel model); public abstract String getPath(FileModel model); public abstract String getPath(JavaSourceFileModel javaSourceModel); @Override public String getDescription() { return "Takes a " + FileModel.class.getSimpleName() + " as a parameter and either the qualified name (if it is a Java file) or the path within the file's project."; } }