Uriah Carpenter created TAP5-2127:
-------------------------------------
Summary: Access of Groovy field varies with configured production
mode when accessing field inside closure
Key: TAP5-2127
URL: https://issues.apache.org/jira/browse/TAP5-2127
Project: Tapestry 5
Issue Type: Bug
Components: plastic
Affects Versions: 5.3.7
Reporter: Uriah Carpenter
Priority: Critical
Create a Groovy page class that contains a field that has private access.
Within a method, set the field to an initial value; use a Groovy closure to
access the field.
When running with production-mode = FALSE everything works correctly.
When running with production-mode = TRUE an NPE will be thrown when accessing
the field from inside the closure.
This commit shows the an example of the problem:
https://github.com/Widen/tapestry5-idea/commit/9cb5be82db6ea917238aaf7e7b3f3e6067681913
You can download and run the example from
https://github.com/Widen/tapestry5-idea
Tested with Groovy version 2.0.8 and Tapestry 5.3.7
The error stack trace is:
<code>
Caused by: java.lang.NullPointerException: Cannot invoke method leftShift() on
null object
at
org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:77)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:45)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:32)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
~[groovy-all-2.0.8.jar:2.0.8]
at
com.example.plaid.pages.PersistBug$_getOutput_closure1.doCall(PersistBug.groovy:32)
~[tapestry5-idea/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
~[na:1.6.0_45]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
~[na:1.6.0_45]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
~[na:1.6.0_45]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_45]
at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
~[groovy-all-2.0.8.jar:2.0.8]
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272)
~[groovy-all-2.0.8.jar:2.0.8]
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:906)
~[groovy-all-2.0.8.jar:2.0.8]
at groovy.lang.Closure.call(Closure.java:412)
~[groovy-all-2.0.8.jar:2.0.8]
at groovy.lang.Closure.call(Closure.java:425)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1326)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1298)
~[groovy-all-2.0.8.jar:2.0.8]
at org.codehaus.groovy.runtime.dgm$148.invoke(Unknown Source)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:271)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
~[groovy-all-2.0.8.jar:2.0.8]
at
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
~[groovy-all-2.0.8.jar:2.0.8]
at com.example.plaid.pages.PersistBug.getOutput(PersistBug.groovy:27)
~[tapestry5-idea/:na]
at $InternalPropertyConduit_13053058e1131f47.get(Unknown Source)
~[na:na]
at
org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:59)
~[tapestry-core-5.3.7.jar:na]
</code>
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira