groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dinko Srko─Ź <dinko.sr...@gmail.com>
Subject Re: No Such Property - When executing script from Java.
Date Wed, 17 Jun 2015 08:12:58 GMT
I think the only required change in the script is to add the `@Field`
annotation. The `.&execute` part doesn't seem necessary.

It might be worth mentioning that adding the annotation changes how we name
things. We're not talking about properties any more, but fields (although
the `formFilled` wasn't actually a script's property, but rather a binding,
because it lacks the `def` of type declaration prefix).

There is another thing that should be fixed in the original code - this
time it's the Java snippet:

    scriptClass.getDeclaredMethod("invoke", new Class[] {})

should be:

    scriptClass.getDeclaredMethod("invoke", new Class[] {Object.class})

otherwise the `getDeclareMethod` won't be able to find the script's
`invoke` method, as the method accepts a parameter.

Cheers,
Dinko


On 17 June 2015 at 08:36, Erick Nelson <ericksn@gmail.com> wrote:

> try this for your groovy script...
>
> import groovy.transform.Field
>
> class Action {
>     String actionName
>     void execute () {
>         println "Doing '$actionName'"
>     }
> }
>
> @Field formFilled = new Action(actionName: "Form Filled").&execute
> @Field mailSent = new Action(actionName: "Mail Sent").&execute
>
> void invoke (String action) {
>     "${action}"()
> }
>
> On Tue, Jun 16, 2015 at 7:35 PM, Owen Rubel <orubel@gmail.com> wrote:
>
>> The 'Bugger' exception is an internationalized error for people in Great
>> Britain to let them know they are truly fucked.
>>
>> Seriously though, in the script you sent, it doesn't look like you
>> declared 'formFilled'.
>>
>> At a minimum, declare it with def:
>>
>> def formFilled = new Action("Form Filled")
>>
>>
>> Owen Rubel
>> 415-971-0976
>> orubel@gmail.com
>>
>> On Tue, Jun 16, 2015 at 6:57 PM, Paul Henry <paul.henry@futrix.com>
>> wrote:
>>
>>> Hi All,
>>>
>>> I am trying to run a groovy script from Java and getting the following
>>> error
>>>
>>> <quote>Exception in thread "main"
>>> org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack: No
>>> such property: formFilled for class: Bugger</quote>
>>>
>>> My script looks like this.
>>>
>>> <quote>
>>> class Action {
>>>     String actionName
>>>     Action(actionName) {
>>>         this.actionName = actionName;
>>>     }
>>>     void execute() {
>>>         println "Doing $actionName"
>>>     }
>>> }
>>>
>>> formFilled = new Action("Form Filled")
>>>
>>> mailSent = new Action("Mail Sent")
>>>
>>> def invoke(action) {
>>>     this."$action".execute()
>>> }
>>>
>>> //----- These are runnable when run as a script.
>>> formFilled.execute()
>>> invoke("mailSent")
>>> </quote>
>>>
>>> If i execute the script directly then the last two lines execute and
>>> produce the expected Strings printed to the standard out.
>>>
>>> <quote>
>>> Doing Form Filled
>>> Doing Mail Sent
>>> </quote>
>>>
>>> I am trying to run it from Java with something like the following.
>>>
>>> <quote>
>>> Class scriptClass = new GroovyClassLoader().parseClass(new
>>> File(Bugger.groovy));
>>> Object scriptInstance = scriptClass.newInstance();
>>> scriptClass.getDeclaredMethod("invoke", new Class[]
>>> {}).invoke(scriptInstance, new Object[] {"formFilled"});
>>> </quote>
>>>
>>> But I keep getting the No Such property exception. Ive looked around for
>>> solutions, but either Im missing something so basic its generally
>>> understood, or i haven't found the right part of the internet.
>>>
>>> So Two questions.
>>>
>>> 1) why is the property not available / hidden. I don't understand why
>>> its not available to a method within what I expect is the class.
>>>
>>> 2) what change do I have to make to my code snippets to get it to work.
>>>
>>> (Note: I've created a simple example of the problem, rather than post my
>>> actual code. I am using groovy to define a DSL for describing actions. We
>>> then parse a script in that DSL defining different actions. During
>>> operation we want to trigger individual actions to execute on certain
>>> occurrences)
>>>
>>> Cheers
>>>
>>> -Paul
>>>
>>>
>>>
>>> Paul Henry
>>> Senior Technical Developer |
>>> 79 Boulcott Street, Level 2, Wellington 6011, New Zealand
>>> <https://maps.google.com/maps?q=79+Boulcott+Street,+Level+2,+Wellington+6011,+New+Zealand>
>>>
>>> tel +64 4 499 1327 | mob +64 22 161 8700
>>> paul.henry@futrix.com | www.futrix.com | LinkedIn
>>> <http://www.linkedin.com/company/futrix-ltd>
>>>
>>>
>>
>

Mime
View raw message