On Apr 7, 9:33 am, Hannes Wallnoefer <[email protected]> wrote: > On Apr 2, 2:39 pm, Wernke <[email protected]> wrote: > > > > > Hi all, > > > I have a Java class 'Procedure' derived from ScriptableObject that has > > a public enum Result {OK, ERROR}. How can I make the enum values > > available to a script? > > > As an example, say there is a method Procedure.setResult( Result r ), > > which I want to call from the script with an OK value. > > > I found that with a given Procedure object proc I can do: > > > proc.setResult( Packages.my.namespace.Procedure.Result.OK ); > > > but I find this clumsy. > > > What would I have to do to be able to call > > > proc.setResult( OK ) or at least proc.setResult( Result.OK ) > > > without any further import or such in the script? What I am actually > > looking for is a Java method on ScriptableObject that makes the const > > enum values visible and usable in the script, just similar to > > defineProperty(). > > If you are using ScriptableObject.defineClass() to set up your > Procedure host object then the finishInit() method is your friend. > > http://www.mozilla.org/rhino/apidocs/org/mozilla/javascript/Scriptabl...) > > You can use it to set up all kinds of properties on the constructor, > global scope, or prototype. For example, to set up the enum values as > constants in the Procedure constructor: > > public static void finishInit(Scriptable scope, FunctionObject > constructor, Scriptable prototype) { > int flags = DONTENUM | READONLY | PERMANENT; > constructor.defineProperty("OK", Context.toObject(Result.OK, > scope), flags); > constructor.defineProperty("ERROR", Context.toObject > (Result.ERROR, scope), flags); > } > > or as global constants: > > public static void finishInit(Scriptable scope, FunctionObject > constructor, Scriptable prototype) { > int flags = DONTENUM | READONLY | PERMANENT; > ScriptableObject.defineProperty(scope, "OK", Context.toObject > (Result.OK, scope), flags); > ScriptableObject.defineProperty(scope, "ERROR", > Context.toObject(Result.ERROR, scope), flags); > } > > I also tried to setting up the enum class as constant in the global > scope, but that didn't work, probably because of how enums and their > constants are represented within the jvm. Note that finishInit must be > declared public in order to work. > > hannes > > > Thanks for any suggestions, > > > Wernke
Hi Hannes, thanks a lot for your hint. I had overlooked the defineClass() method, and actually I do not need it, because I do not want to create Procedure instances from scripts. I want to create Procedure objects from Java code and then run a script that can access the Procedure's methods and properties (and the enum, of course). I am now simply defining the properties OK and ERROR with the defineProperty() method, in conjunction with Context.toObject (enumValue, scope) directly after creating a Procedure instance. That works perfectly - I can use the objects OK and ERROR in scripts without string quotes, and that is what I was actually looking for. These objects even convert themselves to the strings 'OK' and 'ERROR' when used in a string context. Perhaps I can still find a way to define the entire enum class in one go, without defining each value separately. That would be more than perfect. Thank you again! Regards, Wernke _______________________________________________ dev-tech-js-engine-rhino mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino
