package cn.org.rapid_framework.velocity.directive; import java.io.IOException; import java.io.Writer; import org.apache.velocity.context.InternalContextAdapter; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.parser.node.Node; import cn.org.rapid_framework.velocity.directive.OverrideDirective.OverrideNodeWrapper; import freemarker.core.Environment; import freemarker.template.TemplateDirectiveBody; /** * @author badqiu */ public class BlockDirective extends org.apache.velocity.runtime.directive.Directive{ @Override public String getName() { return "block"; } @Override public int getType() { return BLOCK; } @Override public boolean render(InternalContextAdapter context, Writer writer, Node node) throws IOException, ResourceNotFoundException, ParseErrorException,MethodInvocationException { String name = Utils.getRequiredArgument(context, node, 0,getName()); OverrideNodeWrapper overrideNode = getOverrideNode(context,name); Node topNode = node.jjtGetChild(1); if(overrideNode == null) { return topNode.render(context, writer); }else { Utils.setParentForTop(new OverrideNodeWrapper(topNode),overrideNode); return overrideNode.render(context, writer); } } private OverrideNodeWrapper getOverrideNode(InternalContextAdapter context,String name) { return (OverrideNodeWrapper)context.get(Utils.getOverrideVariableName(name)); } }