package org.caudexorigo.jpt;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang3.StringEscapeUtils;
import org.caudexorigo.ErrorAnalyser;
import org.mvel2.ParserContext;
import org.mvel2.templates.CompiledTemplate;
import org.mvel2.templates.TemplateCompiler;
import org.mvel2.templates.TemplateRuntime;
public class JptTemplateNode extends JptNode
{
private boolean _isInSlot;
private CompiledTemplate _compiled_template;
private String _template;
JptTemplateNode(String template, boolean isInSlot)
{
_template = StringEscapeUtils.unescapeXml(template);
_isInSlot = isInSlot;
}
public int getChildCount()
{
return 0;
}
public JptNode getChild(int i)
{
throw new IndexOutOfBoundsException("Output Expressions do not have children");
}
public void render(Map<String, Object> context, Writer out) throws IOException
{
try
{
if (_compiled_template == null)
{
ParserContext parser_context = ParserContext.create();
Set<Entry<String, Object>> ctx_entries = context.entrySet();
for (Entry<String, Object> entry : ctx_entries)
{
parser_context.addInput(entry.getKey(), entry.getValue().getClass());
}
_compiled_template = TemplateCompiler.compileTemplate(_template, parser_context);
}
}
catch (Throwable t)
{
Throwable r = ErrorAnalyser.findRootCause(t);
throw new RuntimeException(String.format("Error processing template:%ncontext: %s;%nmessage: '%s'", context, r.getMessage()));
}
String sout = String.valueOf(TemplateRuntime.execute(_compiled_template, context));
out.write(sout);
}
public boolean isInSlot()
{
return _isInSlot;
}
}