Class RuntimeMacro

  • All Implemented Interfaces:
    java.lang.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 Detail

      • macroName

        private java.lang.String macroName
        Name of the macro
      • literal

        private java.lang.String literal
        Literal text of the macro
      • node

        private Node node
        Node of the macro call
      • strictRef

        protected boolean strictRef
        Indicates if we are running in strict reference mode.
      • badArgsErrorMsg

        private java.lang.String badArgsErrorMsg
        badArgsErrorMsg will be non null if the arguments to this macro are deamed bad at init time, see the init method. If his is non null, then this macro cannot be rendered, and if there is an attempt to render we throw an exception with this as the message.
    • Constructor Detail

      • RuntimeMacro

        public RuntimeMacro​(java.lang.String macroName)
        Create a RuntimeMacro instance. Macro name and source template stored for later use.
        Parameters:
        macroName - name of the macro
    • Method Detail

      • getName

        public java.lang.String getName()
        Return name of this Velocimacro.
        Specified by:
        getName in class Directive
        Returns:
        The name of this Velocimacro.
      • getScopeName

        public java.lang.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 class Directive
      • getType

        public int getType()
        Velocimacros are always LINE type directives.
        Specified by:
        getType in class Directive
        Returns:
        The type of this directive.
      • init

        public void init​(RuntimeServices rs,
                         InternalContextAdapter context,
                         Node node)
        Intialize the Runtime macro. At the init time no implementation so we just save the values to use at the render time.
        Overrides:
        init in class Directive
        Parameters:
        rs - runtime services
        context - InternalContextAdapter
        node - node containing the macro call
      • getLiteral

        private java.lang.String getLiteral()
        It is probably quite rare that we need to render the macro literal so do it only on-demand and then cache the value. This tactic helps to reduce memory usage a bit.