Wow great information digging Scott. Maybe we have many other bits of redundant code that are just sitting out there for historical reasons.
Anyway I think this settles the mystery and perhaps we should work on refactoring the code to attempt to get rid of it? On Fri, Jul 27, 2018, 12:49 AM Scott Gray <[email protected]> wrote: > I looked back through an old copy of the pre-ASF repo and found that the > "context" references were added in 2006 and it had something to do with > making MapStack a LocalizedMap for screen/form widget internalization > rendering. The commit message and a small explanation in the mailing lists > didn't explain that specific addition unfortunately. Could be that it > isn't used there anymore, at the time freemarker macros weren't used for > widget rendering, so it's possible that a fix in the freemarker render > could remove the need for it. > > Regards > Scott > > On 21 July 2018 at 17:12, Mathieu Lirzin <[email protected]> > wrote: > > > Hello Scott, > > > > Scott Gray <[email protected]> writes: > > > > > I think it relates to the "context" variable that is frequently used in > > > groovy data prep scripts for the script output. > > > > > > I'm not in front of a computer, but looking at it in that light may > help. > > > > As shown by this snippet from ‘GroovyUtil.java’, the “context” binding > > is added explicitly so it doesn't require the ‘MapStack’ special case > > for the "context" key. In fact since the context is copied to an > > ‘HashMap’ before being passed to Groovy, the ‘MapStack’ implementation > > is not used at all from Groovy. > > > > --8<---------------cut here---------------start------------->8--- > > public static Binding getBinding(Map<String, Object> context, String > > expression) { > > Map<String, Object> vars = new HashMap<>(); > > if (context != null) { > > vars.putAll(context); > > if (UtilValidate.isNotEmpty(expression)) { > > ...; > > } > > vars.put("context", context); > > ...; > > } > > return new Binding(vars); > > } > > > > public static Object runScriptAtLocation(String location, String > > methodName, Map<String, Object> context) throws GeneralException { > > Script script = InvokerHelper.createScript( > > getScriptClassFromLocation(location), getBinding(context)); > > Object result = null; > > if (UtilValidate.isEmpty(methodName)) { > > result = script.run(); > > } else { > > result = script.invokeMethod(methodName, new Object[] { > > context }); > > } > > return result; > > } > > --8<---------------cut here---------------end--------------->8--- > > > > What is nice is that the ‘getBinding’ method has a javadoc explaining > > why the “context” binding is added explicitly. Thanks to Adrian Crum > > (RIP) for providing it. > > > > --8<---------------cut here---------------start------------->8--- > > The ‘context’ Map is added to the ‘Binding’ as a variable called > > "context" so that variables can be passed back to the caller. > > --8<---------------cut here---------------end--------------->8--- > > > > Thanks for your input. > > > > -- > > Mathieu Lirzin > > GPG: F2A3 8D7E EB2B 6640 5761 070D 0ADE E100 9460 4D37 > > >
