package core.framework.impl.template.fragment; import core.framework.api.util.Exceptions; import core.framework.impl.reflect.GenericTypes; import core.framework.impl.template.TemplateContext; import core.framework.impl.template.TemplateMetaContext; import core.framework.impl.template.expression.ExpressionBuilder; import core.framework.impl.template.expression.ExpressionHolder; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author neo */ public class IfFragment extends ContainerFragment { private static final Pattern STATEMENT_PATTERN = Pattern.compile("((!)?)([#a-zA-Z0-9\\.\\(\\)]+)"); private final ExpressionHolder expression; private final boolean reverse; public IfFragment(String statement, TemplateMetaContext context, String location) { Matcher matcher = STATEMENT_PATTERN.matcher(statement); if (!matcher.matches()) throw Exceptions.error("statement must match \"(!)condition\", statement={}, location={}", statement, location); reverse = "!".equals(matcher.group(2)); String condition = matcher.group(3); expression = new ExpressionBuilder(condition, context, location).build(); if (!Boolean.class.equals(GenericTypes.rawClass(expression.returnType))) throw Exceptions.error("if statement must return Boolean, condition={}, returnType={}, location={}", condition, expression.returnType.getTypeName(), location); } @Override public void process(StringBuilder builder, TemplateContext context) { Object result = expression.eval(context); Boolean expected = reverse ? Boolean.FALSE : Boolean.TRUE; if (expected.equals(result)) { processChildren(builder, context); } } }