Class ProxyVMContext

All Implemented Interfaces:
Context, InternalContextAdapter, InternalEventContext, InternalHousekeepingContext, InternalWrapperContext

public class ProxyVMContext extends ChainedInternalContextAdapter
Context for Velocity macro arguments. This special context combines ideas of earlier VMContext and VMProxyArgs by implementing routing functionality internally. This significantly reduces memory allocation upon macro invocations. Since the macro AST is now shared and RuntimeMacro directive is used, the earlier implementation of precalculating VMProxyArgs would not work. See Issue 607 for more info on this class.
Since:
1.6
Version:
$Id$
  • Field Details

    • vmproxyhash

      Map vmproxyhash
      container for our macro AST node arguments. Size must be power of 2.
    • localcontext

      Map localcontext
      container for any local or constant macro arguments. Size must be power of 2.
    • localContextScope

      private boolean localContextScope
      support for local context scope feature, where all references are local
    • rsvc

      private RuntimeServices rsvc
      needed for writing log entries.
  • Constructor Details

    • ProxyVMContext

      public ProxyVMContext(InternalContextAdapter inner, RuntimeServices rsvc, boolean localContextScope)
      Parameters:
      inner - Velocity context for processing
      rsvc - RuntimeServices provides logging reference
      localContextScope - if true, all references are set to be local
  • Method Details

    • addVMProxyArg

      public void addVMProxyArg(InternalContextAdapter context, String macroArgumentName, String literalMacroArgumentName, Node argumentValue) throws MethodInvocationException
      Used to put Velocity macro arguments into this context.
      Parameters:
      context - rendering context
      macroArgumentName - name of the macro argument that we received
      literalMacroArgumentName - ".literal.$"+macroArgumentName
      argumentValue - actual value of the macro argument
      Throws:
      MethodInvocationException
    • addVMProxyArg

      public void addVMProxyArg(InternalContextAdapter context, String macroArgumentName, String literalMacroArgumentName, Renderable argumentValue) throws MethodInvocationException
      Used to put Velocity macro bodyContext arguments into this context.
      Parameters:
      context - rendering context
      macroArgumentName - name of the macro argument that we received
      literalMacroArgumentName - ".literal.$"+macroArgumentName
      argumentValue - actual value of the macro body
      Throws:
      MethodInvocationException
    • isConstant

      private boolean isConstant(Node node)
      AST nodes that are considered constants can be directly saved into the context. Dynamic values are stored in another argument hashmap.
      Parameters:
      node - macro argument as AST node
      Returns:
      true if the node is a constant value
    • put

      public Object put(String key, Object value)
      Impl of the Context.put() method.
      Specified by:
      put in interface Context
      Overrides:
      put in class ChainedInternalContextAdapter
      Parameters:
      key - name of item to set
      value - object to set to key
      Returns:
      old stored object
    • localPut

      public Object localPut(String key, Object value)
      Allows callers to explicitly put objects in the local context, no matter what the velocimacro.context.local setting says. Needed e.g. for loop variables in foreach.
      Specified by:
      localPut in interface InternalWrapperContext
      Overrides:
      localPut in class ChainedInternalContextAdapter
      Parameters:
      key - name of item to set.
      value - object to set to key.
      Returns:
      old stored object
      See Also:
    • put

      protected Object put(String key, Object value, boolean forceLocal)
      Internal put method to select between local and global scope.
      Parameters:
      key - name of item to set
      value - object to set to key
      forceLocal - True forces the object into the local scope.
      Returns:
      old stored object
    • get

      public Object get(String key)
      Implementation of the Context.get() method. First checks localcontext, then arguments, then global context.
      Specified by:
      get in interface Context
      Overrides:
      get in class ChainedInternalContextAdapter
      Parameters:
      key - name of item to get
      Returns:
      stored object or null
    • containsKey

      public boolean containsKey(Object key)
      Description copied from interface: Context
      Indicates whether the specified key is in the context.
      Specified by:
      containsKey in interface Context
      Overrides:
      containsKey in class ChainedInternalContextAdapter
      Parameters:
      key - The key to look for.
      Returns:
      Whether the key is in the context.
      See Also:
    • getKeys

      public Object[] getKeys()
      Description copied from interface: Context
      Get all the keys for the values in the context.
      Specified by:
      getKeys in interface Context
      Overrides:
      getKeys in class ChainedInternalContextAdapter
      Returns:
      All the keys for the values in the context.
      See Also:
    • remove

      public Object remove(Object key)
      Description copied from interface: Context
      Removes the value associated with the specified key from the context.
      Specified by:
      remove in interface Context
      Overrides:
      remove in class ChainedInternalContextAdapter
      Parameters:
      key - The name of the value to remove.
      Returns:
      The value that the key was mapped to, or null if unmapped.
      See Also: