package squill.generate; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.context.Context; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; import squill.util.FileUtil; import java.io.*; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class VelocityGenerator { public String generate(String template, Object... input) { return generate(template, createMap(input)); } private Map<String, Object> createMap(final Object... input) { Map<String, Object> inputs = new HashMap<String, Object>(input.length); for (Object ob : input) { inputs.put(ob.getClass().getSimpleName(), ob); } return inputs; } public String generate(String templateFile, Map<String, ? extends Object> inputs) { try { final VelocityEngine engine = initVelocity(); final Template template = engine.getTemplate(templateFile + ".vm"); final StringWriter writer = new StringWriter(); Context ctx = new VelocityContext(new HashMap<String, Object>(inputs)); template.merge(ctx, writer); return writer.toString(); } catch (Exception e) { throw new RuntimeException("Error rendering template " + templateFile + " with inputs " + inputs, e); } } private VelocityEngine initVelocity() throws Exception { final VelocityEngine engine = new VelocityEngine(); // TODO velocity.properties Properties props = new Properties(); props.put("resource.loader", "file,class"); props.put("class.resource.loader.class", ClasspathResourceLoader.class.getName()); props.put("velocimacro.library", FileUtil.path(getClass())+"Macros.vm"); engine.init(props); return engine; } }