On 01/08/2009, Rahul Akolkar <rahul.akol...@gmail.com> wrote:
> On Sat, Aug 1, 2009 at 10:10 AM, sebb<seb...@gmail.com> wrote:
>  > On 01/08/2009, Rahul Akolkar <rahul.akol...@gmail.com> wrote:
>  >> On Sat, Aug 1, 2009 at 12:21 AM, sebb<seb...@gmail.com> wrote:
>  >>  > On 01/08/2009, Rahul Akolkar <rahul.akol...@gmail.com> wrote:
>  >>  >> On Fri, Jul 31, 2009 at 9:42 PM, sebb<seb...@gmail.com> wrote:
>  >>  >>  > On 31/07/2009, Rahul Akolkar <rahul.akol...@gmail.com> wrote:
>  >>  >>  >> On Thu, Jul 30, 2009 at 10:54 PM, sebb<seb...@gmail.com> wrote:
>  >>
>  >> <snip/>
>  >>
>  >> >>  >>  > Several items remain to be resolved:
>  >>  >>  >>  >
>  >>  >>  >>  > The current implementation only has direct access to the 
> ENGINE_SCOPE bindings.
>  >>  >>  >>  >
>  >>  >>  >>  > If we wish to give direct access to GLOBAL_SCOPE, how should 
> this be managed?
>  >>  >>  >>  > Perhaps use a name prefix to indicate that the variable is 
> intended to
>  >>  >>  >>  > be global?
>  >>  >>  >>  >
>  >>  >>  >>
>  >>  >>  >> <snap/>
>  >>  >>  >>
>  >>  >>  >>  No. The engine scope is nearest, so on read or update, check 
> engine
>  >>  >>  >>  first and global second. No prefixes.
>  >>  >>  >>
>  >>  >>  >
>  >>  >>  > That's fine, but how does one create an entry in the global table?
>  >>  >>  > Or is that not allowed?
>  >>  >>  >
>  >>  >>
>  >>  >> <snap/>
>  >>  >>
>  >>  >>  Thats the job of the javax.script environment. More specifically, the
>  >>  >>  ScriptEngineManager will inject the global scope bindings into the
>  >>  >>  ScriptEngine. We just have to heed those -- IOW, anything other than
>  >>  >>  put(), putAll() and remove() in the JexlContextWrapper class you have
>  >>  >>  should refer to the union of the engine and global scopes. For 
> methods
>  >>  >>  where orders matters i.e. containsKey/Value() and get(), engine scope
>  >>  >>  beats global. Finally, IMO the clear() implementation should remain
>  >>  >>  as-is and not touch the global scope.
>  >>  >>
>  >>  >
>  >>  > Yes, one can now set up the global scope with some key-value pairs;
>  >>  > these are now readable/writable by a JEXL script. However, it's not
>  >>  > currently possible to create a global key. If put() uses a key that is
>  >>  > not currently present, it will generate an engine-scope variable.
>  >>  >
>  >>
>  >> <snap/>
>  >>
>  >>  Yup, as it should.
>  >>
>  >>
>  >>
>  >>  > Seems to me if we allow read/write/delete of global variables by a
>  >>  > JEXL script, then we should also allow creation of global variables.
>  >>
>  >> <snip/>
>  >>
>  >>  Except there is no real delete.
>  >>
>  >
>  > Ah, I was wondering about that.
>  > So presumably JEXL never invokes remove() on the Jexl context?
>  > I checked in Eclipse and it could not find a reference.
>  >
>
> <snip/>
>
>  Not unless the user manipulates the JexlContext vars map directly.
>
>
>
>  >>
>  >>  > This would allow different scripts (possibly different languages) to
>  >>  > communicate via the global area.
>  >>  >
>  >>  > How to allow this? One method would be to use a naming convention.
>  >>  > Another might be to have a global-shift key - if the key is set, then
>  >>  > apply changes to the global scope only, for example:
>  >>  >
>  >>  > localvar=123;
>  >>  > set_scope="global"
>  >>  > globalval=456;
>  >>  > set_scope="local"
>  >>  >
>  >>  > A bit of a hack, but do-able.
>  >>  >
>  >>
>  >> <snap/>
>  >>
>  >>  No need to hack the EL itself.
>  >
>  > That would not need a change to the EL.
>  > The script engine would just need to check the value of the
>  > "set_scope" variable.
>  >
>
> <snap/>
>
>  Its another difference between a standalone JEXL script and one
>  executed in a 223 environment. So it needs to be added, maintained,
>  documented, understood (by users) and used correctly. As you already
>  point out below, this is all doable right now via the 'context'
>
> variable.
>
>
>  >>  Folks needing to create global variables can always inject into the
>  >>  engine scope an object with a method that creates a global variable
>  >>  (and invoke it in jexl script as needed).
>  >
>  > Or use
>  >
>  > context.getBindings(200).put(key,value);
>  >
>  > Given that read/write access to global variables is now handled the
>  > same as for engine variables, I thought it would be convenient to do
>  > the same for global variable creation.
>  >
>  >>
>  >>  > The ScriptEngine implementation could even make certain classes of
>  >>  > global variables read-only, for example System_OUT etc. by disallowing
>  >>  > changes to them.
>  >>  >
>  >>
>  >> <snip/>
>  >>
>  >>  Yeah, making any built-in variables read-only sounds good.
>  >
>  > For which I think we need a naming convention...
>  >
>
> <snip/>
>
>  Built-in variables are a bit of a pain (we use them more extensively
>  in Commons SCXML as they are required by the spec) so if there is any
>  way to avoid having more of them, that'd be good. How about one JEXL
>  object that any built-in stuff hangs off? So, JEXL.out would be
>  System.out, for example. Extensible in the sense that JEXL.foo and
>  JEXL.bar could come along as needed without polluting the vars map
>  with more built-in names.

Nice!

Sounds good, I'll create an initial implementation.

Probably OK to use global scope to store it in?

>
>  -Rahul
>
>  ---------------------------------------------------------------------
>  To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>  For additional commands, e-mail: dev-h...@commons.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to