package org.caudexorigo.jpt; import java.io.IOException; import java.io.Serializable; import java.io.Writer; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.caudexorigo.ErrorAnalyser; import org.mvel2.MVEL; import org.mvel2.ParserContext; public class JptConditionalNode extends JptParentNode { private Serializable _compiled_exp; private boolean _isInSlot; private String _bool_exp; JptConditionalNode(String jpt_exp, boolean isInSlot) { _isInSlot = isInSlot; _bool_exp = StringUtils.isBlank(jpt_exp) ? "true" : StringUtils.replace(jpt_exp, "\'", "\""); // System.out.println("JptConditionalNode.JptConditionalNode.jpt_exp: " + jpt_exp); } boolean isConditionalNode() { return true; } public void render(Map<String, Object> context, Writer out) throws IOException { try { if (_compiled_exp == 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()); } // Compile the expression. _compiled_exp = MVEL.compileExpression(_bool_exp, parser_context); } boolean condition = (Boolean) MVEL.executeExpression(_compiled_exp, context); // System.out.printf("JptConditionalNode.render -> expression: '%s'; condition: %s%n", _bool_exp, condition); // boolean condition = (Boolean) MVEL.evalToBoolean(_bool_exp, context); if (condition) { int child_count = getChildCount(); for (int i = 0; i < child_count; i++) { JptNode jpt_node = getChild(i); jpt_node.render(context, out); } } } catch (Throwable t) { Throwable r = ErrorAnalyser.findRootCause(t); throw new RuntimeException(String.format("Error processing JptConditionalNode:%nexpression: '%s';%ncontext: %s;%nmessage: '%s'", _bool_exp, context, r.getMessage())); } } public boolean isInSlot() { return _isInSlot; } }