Tobia Conforto wrote:
Jason Johnston wrote:
Rhino also makes the JavaScript methods available to Java strings if
the java.lang.String class doesn't already define them. For example:

   js> javaString.match(/a.*/)

Thanks, that clears part of the confusion to me.

It also explains why sometimes I could get away with treating strings
as the language (JavaScript) calls for, while other times I couldn't.
For example match() works the same on both string types, as the example
says, while replace() doesn't.  That's just great.

To complicate matters further, I cannot simply wrap a java.lang.String
in a JS String() constructor and call replace() on the resulting object,
because whenever I handle a java.lang.String I must expect to receive a
Java null, but that becomes a JS null, and String(null) == 'null'!

So:

        null is false
        "" is false
        java.lang.String("") is true (!)
        String(java.lang.String("")) is false
        String(null) is true

Yeah that's definitely not fun. :-)

So digging around in the Rhino API I discovered the WrapFactory class[1], which is what Rhino uses to wrap Java objects returned from methods so that they can be scripted. By default it wraps java.lang.String objects just like it wraps any other Java object, giving your script access to its Java methods. But it does allow you to switch this behavior for "primitive" values (strings, numbers, booleans), so that it exposes them as native JavaScript primitives e.g. the JavaScript String.

You can flip that switch by adding the following line to your flowscript:

Packages.org.mozilla.javascript.Context.getCurrentContext().getWrapFactory().setJavaPrimitiveWrap(false);

At least in my limited testing this seems to cause any Java String values returned from methods to be treated as JavaScript String primitives. For example the replace() method works just fine and it shouldn't have the issues with nulls you mentioned earlier.

Give it a try, hope it works for you.
--Jason

[1] http://www.mozilla.org/rhino/apidocs/org/mozilla/javascript/WrapFactory.html


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to