package ilarkesto.velocity; import ilarkesto.base.Str; import ilarkesto.core.logging.Log; import ilarkesto.io.IO; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.util.Map; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; public class Velocity { public static final String LIB_TEMPLATE_NAME = "VM_global_library.vm"; private static Log log = Log.get(Velocity.class); private File templateDir; private VelocityEngine velocityEngine; public Velocity(File templateDir) { this.templateDir = templateDir; velocityEngine = createEngine(templateDir); } public static void processDir(File templateDir, File outputDir, ContextBuilder context) { processDir(templateDir, outputDir, context.toVelocityContext()); } public static void processDir(File templateDir, File outputDir, VelocityContext velocityContext) { Velocity velocity = new Velocity(templateDir); File[] files = templateDir.listFiles(); if (files == null) return; IO.createDirectory(outputDir); for (File templateFile : files) { String name = templateFile.getName(); if (name.equals(LIB_TEMPLATE_NAME)) continue; log.debug(" ", name); boolean velocityTemplate = name.endsWith(".vm"); if (velocityTemplate) { File outputFile = new File(outputDir.getAbsolutePath() + "/" + Str.removeSuffix(name, ".vm")); velocity.processTemplate(name, outputFile, velocityContext); } else { IO.copyFile(templateFile, new File(outputDir.getPath() + "/" + name)); } } } public void processTemplate(String name, File outputFile, ContextBuilder context) { processTemplate(name, outputFile, context.toVelocityContext()); } public void processTemplate(String name, File outputFile, VelocityContext velocityContext) { log.debug("Processing", templateDir.getAbsolutePath() + "/" + name, "->", outputFile.getAbsolutePath()); IO.createDirectory(outputFile.getParentFile()); try { Template template = velocityEngine.getTemplate(name); BufferedWriter out = new BufferedWriter(new FileWriter(outputFile)); template.merge(velocityContext, out); out.close(); } catch (Exception ex) { throw new RuntimeException(ex); } } public static VelocityContext createContext(Map<String, ?> context) { VelocityContext velocityContext = new VelocityContext(); for (Map.Entry<String, ?> entry : context.entrySet()) { velocityContext.put(entry.getKey(), entry.getValue()); } return velocityContext; } private static VelocityEngine createEngine(File templateDir) { VelocityEngine velocityEngine = new VelocityEngine(); String encoding = IO.UTF_8; velocityEngine.setProperty(VelocityEngine.ENCODING_DEFAULT, encoding); velocityEngine.setProperty(VelocityEngine.INPUT_ENCODING, encoding); velocityEngine.setProperty(VelocityEngine.OUTPUT_ENCODING, encoding); velocityEngine.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, templateDir.getAbsolutePath()); try { velocityEngine.init(); } catch (Exception ex) { throw new RuntimeException(ex); } return velocityEngine; } }