package org.ukiuni.pacifista.velocity;
import java.io.File;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Random;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.runtime.RuntimeServices;
import org.apache.velocity.runtime.RuntimeSingleton;
import org.apache.velocity.runtime.parser.ParseException;
import org.apache.velocity.runtime.parser.node.SimpleNode;
import org.ukiuni.pacifista.Template;
public class VelocityWrapper implements Template {
private VelocityContext velocityContext;
private org.apache.velocity.Template template;
public VelocityWrapper(File templateDir) {
Velocity.setProperty("file.resource.loader.path", templateDir.getAbsolutePath());
Velocity.init();
}
private VelocityWrapper() {
this.velocityContext = new VelocityContext();
}
@Override
public Template createWithFile(String templatePath) {
VelocityWrapper velocityWrapper = new VelocityWrapper();
velocityWrapper.template = Velocity.getTemplate(templatePath, "UTF-8");
return velocityWrapper;
}
@Override
public Template create(String templateString) {
VelocityWrapper velocityWrapper = new VelocityWrapper();
velocityWrapper.template = newTemplate(templateString);
return velocityWrapper;
}
private org.apache.velocity.Template newTemplate(String templateString) {
RuntimeServices runtimeServices = RuntimeSingleton.getRuntimeServices();
StringReader reader = new StringReader(templateString);
SimpleNode node;
try {
node = runtimeServices.parse(reader, "Template" + new Random().nextInt());
} catch (ParseException e) {
throw new RuntimeException(e);
}
org.apache.velocity.Template template = new org.apache.velocity.Template();
template.setRuntimeServices(runtimeServices);
template.setData(node);
template.initDocument();
return template;
}
@Override
public void put(String key, Object value) {
this.velocityContext.put(key, value);
}
@Override
public String toValue() {
StringWriter writer = new StringWriter();
this.template.merge(this.velocityContext, writer);
return writer.toString();
}
}