The EntityConditionBuilder class is a good example of how we can make scripting more convenient.

Different scripting languages will have varying support for Java classes. It was my hope that we could come up with a Java-based script helper class that can be used by a variety of scripting languages that can access Java objects.

I understand that there is an interest in Groovy in this community, but other communities might prefer a different language. For example, Jython and Ruby have sizable communities.

My motivation in in implementing JSR-223 is the same as my motivation to implement internationalization/globalization years ago - to open up the project to more users.

So, let's try to keep the big picture in mind. If we come up with a scripting convenience, let's try to accommodate the most users with it.

-Adrian


On 3/6/2012 10:23 AM, Scott Gray wrote:
The EntityConditionBuilder class I wrote a while back is a good example of a 
groovy specific utility class, it takes advantage of groovy's language syntax 
features and couldn't be used in any other scripting language (well, not in the 
intended manner anyway).

A possible solution could be to have some sort of configuration file per 
scripting language where classes to be instantiated could be assigned to 
specific context variables:
conditionBuilder=org.ofbiz.entity.condition.EntityConditionBuilder

Or maybe xml if we needed greater configuration control such as passing 
specific context variables into the utility class's constructor, perhaps 
similar in structure to minilang's call-class-method tag.

Regards
Scott

On 6/03/2012, at 8:58 PM, Jacopo Cappellato wrote:

This could work but I was thinking to something more like having some "core" packages (like entity 
and service) always imported in groovy scripts/services; or having the "delegator" and 
"dispatcher" objects properly casted to their interfaces (to take advantage of IDE autocompletion 
features); etc...
But I don't have a clear list at the moment so please do not consider my notes 
a blocker.
I am working at a POC for a "best practice" Groovy service implementation and this should 
end up with a "wish list" of features I would like to have. Then we can discuss the best 
way to achieve this.

Jacopo

On Mar 5, 2012, at 9:14 AM, Adrian Crum wrote:

If you don't mind, I would like to get all of the issues resolved during the 
design phase.

I will wait for the private email to understand what you mean by a "secure" 
scripting package.

What I was suggesting is a script utility object that can be put in the context 
so that all scripting languages can use it. Whatever methods you have in mind 
could be implemented in a generic way and reused. Personally, I would like to 
use something like:

// Groovy, JavaScript
partyValue = script.entityOne("Party");
if (partyValue)...

In other words, have an object in the context that gives us the convenience of 
mini-language.

-Adrian

On 3/5/2012 8:01 AM, Jacopo Cappellato wrote:
On Mar 5, 2012, at 8:46 AM, Adrian Crum wrote:

It seems to me if there is a security issue using Groovy, then there would be 
an issue using any scripting language.
Yes, but what we would bundle ootb would be a secured packaged ready to run Groovy 
scripts in a "secure" way and already packaged with hundreds of scripts.
If the user will add a new jar to support a different script (and the user will 
also have to implement the custom scripts) then this will be less secure but 
there isn't much we could do as we delegate to JSR-223 the implementation of 
security.

Why can't we put the "friendly methods" in the context, so all scripting 
languages can use them?

I am not sure I understand what you are proposing (the method would be language 
specific) but for now we can postpone this discussion at when (if it will ever 
happen) we will discuss about this approach.

Jacopo

-Adrian

On 3/5/2012 6:46 AM, Jacopo Cappellato wrote:
On Mar 4, 2012, at 9:16 PM, Adrian Crum wrote:

The code changes tested fine.

I noticed in your code comments that Groovy should be handled independently 
from other scripting languages. Why do you think that?
First of all, I apologize for having added my personal opinion to those 
comments :-) but I thought that in this way it was easier to exchange design 
ideas; the comments can actually be removed.

The reasons I think we could treat Groovy in a special way (but I don't have a 
strong opinion on this) are:

* ootb OFBiz will still be packaged with Groovy jars (they are required by all the existing scripts 
and by some other code like the implementation of "Groovy service engine" and 
"Groovy event handler") and so the dependency on Groovy will still be there even if we 
run it with JSR-223
* the code to run Groovy in the special way is now all contained in the 
ScriptUtil class and there are actually a few lines of code to maintain for it
* keeping a custom way for Groovy has two main advantages that are not 
currently used but I would like to consider in the short term (and I don't 
think they are supported thru JSR-223... but I am not sure):
** security: I would like to restrict the JVM security settings for dynamic Groovy 
snippets like ${groovy: ...}; I have some concerns in this area that I will address in a 
separate email soon; in this way we will "secure" the ootb system (packaged 
with several groovy scripts and the groovy jars) but of course if the user will add to it 
jars files for a new scripting language (executed using JSR-223) then the security issue 
will still be there, but at least the user will know about it
** I would like to inject some OFBiz friendly methods to all Groovy scripts, so 
that they can be used by Groovy scripts to run services, use the delegator 
etc...

We should also consider the impact on performance, even if the best way to go 
is probably to run some performance tests on the system running Groovy with 
current code and with the system running Groovy using a custom method and then 
compare the results.

Jacopo

-Adrian


On 3/4/2012 7:27 AM, Jacopo Cappellato wrote:
My changes are in commit 1296762

Help with reviews and tests will be very much appreciated.

Jacopo

On Mar 3, 2012, at 1:45 PM, Jacopo Cappellato wrote:

On Mar 1, 2012, at 10:51 AM, Adrian Crum wrote:

As far as I know, most scripting engines have some sort of embedded cache. The 
problem will be that we can't clear the embedded cache like we can with our own 
cache implementation. I don't see that as a show stopper - it's mostly 
inconvenient.

I can help out with the conversion. I don't think the task will be that hard.
Adrian, FYI I am enhancing some of the existing framework code that uses the 
GroovyUtil class to simplify this task.
I will commit my code changes today.

Regards,

Jacopo



Reply via email to