package comeon.templates.velocity;
import com.google.inject.Inject;
import comeon.model.Template;
import comeon.model.processors.PostProcessor;
import comeon.templates.BaseTemplateKind;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;
import org.apache.velocity.runtime.RuntimeConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
public final class VelocityTemplate extends BaseTemplateKind {
private static final Logger LOGGER = LoggerFactory.getLogger(VelocityTemplate.class);
@Inject
public VelocityTemplate(final Set<PostProcessor> postProcessors) {
super(postProcessors);
}
@Override
protected String doRender(final Template template, final String templateText, final Map<String, Object> context) {
final VelocityEngine engine = VelocityTemplates.getInstance().getEngine(Collections.singletonMap(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, template.getFile().getParent().toString()));
final Reader templateReader = new StringReader(templateText);
final Writer outWriter = new StringWriter((int) (templateText.length() * 1.5));
final Context vContext = new VelocityContext(context);
final boolean result = engine.evaluate(vContext, outWriter, template.getName(), templateReader);
if (!result) {
LOGGER.warn("Velocity template rendering failed, see Velocity log");
}
return outWriter.toString();
}
public String toString() {
return "Velocity";
}
}