Class RuntimeMacro
- java.lang.Object
-
- org.apache.velocity.runtime.directive.Directive
-
- org.apache.velocity.runtime.directive.RuntimeMacro
-
- All Implemented Interfaces:
Cloneable
,DirectiveConstants
public class RuntimeMacro extends Directive
This class acts as a proxy for potential macros. When the AST is built this class is inserted as a placeholder for the macro (whether or not the macro is actually defined). At render time we check whether there is a implementation for the macro call. If an implementation cannot be found the literal text is rendered.- Since:
- 1.6
-
-
Field Summary
Fields Modifier and Type Field Description protected boolean
strictRef
Indicates if we are running in strict reference mode.-
Fields inherited from interface org.apache.velocity.runtime.directive.DirectiveConstants
BLOCK, LINE
-
-
Constructor Summary
Constructors Constructor Description RuntimeMacro()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description String
getName()
Return name of this Velocimacro.String
getScopeName()
Override to always return "macro".int
getType()
Velocimacros are always LINE type directives.void
init(RuntimeServices rs, String name, InternalContextAdapter context, Node node)
Initialize the Runtime macro.boolean
render(InternalContextAdapter context, Writer writer, Node node)
Velocimacro implementation is not known at the init time.boolean
render(InternalContextAdapter context, Writer writer, Node node, Renderable body)
This method is used with BlockMacro when we want to render a macro with a body AST.-
Methods inherited from class org.apache.velocity.runtime.directive.Directive
checkArgs, getColumn, getLine, getTemplate, getTemplateName, init, isScopeProvided, makeScope, postRender, preRender, setLocation, setLocation
-
-
-
-
Method Detail
-
getName
public String getName()
Return name of this Velocimacro.
-
getScopeName
public String getScopeName()
Override to always return "macro". We don't want to use the macro name here, since when writing VTL that uses the scope, we are within a #macro call. The macro name will instead be used as the scope name when defining the body of a BlockMacro.- Overrides:
getScopeName
in classDirective
- Returns:
- the name to be used when a scope control is provided for this directive.
-
getType
public int getType()
Velocimacros are always LINE type directives.
-
init
public void init(RuntimeServices rs, String name, InternalContextAdapter context, Node node)
Initialize the Runtime macro. At the init time no implementation so we just save the values to use at the render time.- Parameters:
rs
- runtime servicesname
- macro namecontext
- InternalContextAdapternode
- node containing the macro call
-
render
public boolean render(InternalContextAdapter context, Writer writer, Node node) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException
Velocimacro implementation is not known at the init time. So look for a implementation in the macro libraries and if finds one renders it. The actual rendering is delegated to the VelocimacroProxy object. When looking for a macro we first loot at the template with has the macro call then we look at the macro libraries in the order they appear in the list. If a macro has many definitions above look up will determine the precedence.- Specified by:
render
in classDirective
- Parameters:
context
-writer
-node
-- Returns:
- true if the rendering is successful
- Throws:
IOException
ResourceNotFoundException
ParseErrorException
MethodInvocationException
-
render
public boolean render(InternalContextAdapter context, Writer writer, Node node, Renderable body) throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException
This method is used with BlockMacro when we want to render a macro with a body AST.- Parameters:
context
-writer
-node
-body
- AST block that was enclosed in the macro body.- Returns:
- true if the rendering is successful
- Throws:
IOException
ResourceNotFoundException
ParseErrorException
MethodInvocationException
-
-