Velocity
  1. Velocity
  2. VELOCITY-652

Macros encountered in templates are placed in global scope if no global library is specified and velocimacro.permissions.allow.inline.to.replace.global = false

    Details

    • Type: Improvement Improvement
    • Status: Open
    • Priority: Minor Minor
    • Resolution: Unresolved
    • Affects Version/s: 1.6
    • Fix Version/s: None
    • Component/s: Engine
    • Labels:
      None

      Description

      This is a minor issue and more of a documentation/implementation mismatch. With default settings (allow.inline.to.replace.global=false, velocimacro.library not specified etc.) the first time a velocimacro is encountered in a template, it is placed in global scope and thus replaces all inline macros. Explicitly setting "allow.inline.to.replace.global=true" will cure the issue, even though it should have no effect as there are no global macros specified - hence nothing to replace! Albeit this is a configuration documentation issue, the behavior can be quite confusing and should probably be changed to have an empty global library if none is specified.

      Steps to reproduce:
      1) create new RuntimeInstance and only define the resource loader in properties
      2) create two templates, named test1.vtl and test2.vtl:

      — test1.vtl:
      #macro( myMacro )
      Macro A
      #end

      #myMacro()

      — test2.vtl:
      #macro( myMacro )
      Macro B
      #end

      #myMacro()

      3) first merge() test1.vm, should return "Macro A" (and it does)
      4) now merge() test2.vm, should return "Macro B" but returns "Macro A" instead
      5) create new RuntimeInstance with "velocimacro.permissions.allow.inline.to.replace.global = true"
      6) retry merging and observe correct behavior

        Issue Links

          Activity

          Hide
          Byron Foster added a comment -

          With the default settings there is no concept of scope and as soon as a macro is parsed, whether it is in a library or a template merge call, the macro becomes defined, and cannot be redefined.

          I think the behavior that users expect is:

          velocimacro.permissions.allow.inline.local.scope = true

          Which would also give the results you expect in your example. Like always, the documentation can be better.

          Show
          Byron Foster added a comment - With the default settings there is no concept of scope and as soon as a macro is parsed, whether it is in a library or a template merge call, the macro becomes defined, and cannot be redefined. I think the behavior that users expect is: velocimacro.permissions.allow.inline.local.scope = true Which would also give the results you expect in your example. Like always, the documentation can be better.
          Hide
          Lauri Piispanen added a comment -

          A test case exposing the issue. Uncomment line #24:

          // settings.setProperty("velocimacro.permissions.allow.inline.to.replace.global","true");

          to observe the effect. I've left it commented now so you can add this to your test suite.

          Show
          Lauri Piispanen added a comment - A test case exposing the issue. Uncomment line #24: // settings.setProperty("velocimacro.permissions.allow.inline.to.replace.global","true"); to observe the effect. I've left it commented now so you can add this to your test suite.
          Hide
          Lauri Piispanen added a comment -

          I believe this issue is related to this one. The user most likely has no global velocimacro library defined, thus the need to explicitly set "velocimacro.permissions.allow.inline.to.replace.global=true".

          Show
          Lauri Piispanen added a comment - I believe this issue is related to this one. The user most likely has no global velocimacro library defined, thus the need to explicitly set "velocimacro.permissions.allow.inline.to.replace.global=true".

            People

            • Assignee:
              Unassigned
              Reporter:
              Lauri Piispanen
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:

                Development