History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: OGNL-106
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Critical Critical
Assignee: Jesse Kuhnert
Reporter: Marco von Ballmoos
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
OGNL

Null Pointer Exception when parsing enum constant

Created: 04/Jul/07 12:50 AM   Updated: 15/Jul/07 02:39 PM
Component/s: ExpressionCompiler
Affects Version/s: 2.7
Fix Version/s: 2.7.1

Environment: Tapestry 4.1.2


 Description  « Hide
This problem crops up when upgrading from Tapestry 4.1.1 to Tapestry 4.1.2. An expression of the form:

Page.LoggedInUser.Credentials.getOperationAuthorized(@com.company.system.AccessOperation@Configure, null)

no longer compiles, causing a NPE deep in OGNL. The expression is unchanged between versions and rolling back to the previous library compiles the expression correctly. Another example is documented here:

http://www.nabble.com/-Tap-4.1.2--More-OGNL-problems-t3993459.html

 All   Comments   Change History      Sort Order:
Marco von Ballmoos - [09/Jul/07 01:45 AM ]
*Bump*

Any word on this? This bug is preventing me from migrating one of my larger projects to Tapestry 4.1.2 (and the migration to 4.1.1 failed as well because the Scriptaculous "Suggest" component is only available in 4.1.2). For now, I'm stuck at 4.0.2 until I can either figure out a way around the NPE (not likely) or this bug gets fixed. I sure hope it's not too much trouble ...

Jesse Kuhnert - [09/Jul/07 07:06 PM ]
I don't see a null pointer exception with a similar expression.

Can you try it with the 2.7.1-SNAPSHOT version and paste in the stack trace that you get? http://opencomponentry.com/repository/m2-snapshot-repo/

Marco von Ballmoos - [10/Jul/07 01:07 AM ]
I still get the error with the latest snapshot:

"Unable to parse OGNL expression 'Page.LoggedInUser.Credentials.getOperationAuthorized(@com.encodo.system.AccessOperation@Configure, null)': java.lang.RuntimeException: java.lang.NullPointerException"

Stack trace:

ognl.ASTChain.toGetSourceString(ASTChain.java:328)
org.apache.tapestry.services.impl.HiveMindExpressionCompiler.generateGetter(HiveMindExpressionCompiler.java:297)
org.apache.tapestry.services.impl.HiveMindExpressionCompiler.compileExpression(HiveMindExpressionCompiler.java:152)
ognl.OgnlRuntime.compileExpression(OgnlRuntime.java:524)
ognl.Ognl.compileExpression(Ognl.java:141)
org.apache.tapestry.services.impl.ExpressionCacheImpl.parse(ExpressionCacheImpl.java:152)
org.apache.tapestry.services.impl.ExpressionCacheImpl.getCompiledExpression(ExpressionCacheImpl.java:115)
$ExpressionCache_113aeb80276.getCompiledExpression($ExpressionCache_113aeb80276.java)
org.apache.tapestry.binding.ExpressionBinding.resolveExpression(ExpressionBinding.java:134)
org.apache.tapestry.binding.ExpressionBinding.getObject(ExpressionBinding.java:125)
org.apache.tapestry.binding.AbstractBinding.getObject(AbstractBinding.java:84)
org.apache.tapestry.enhance.EnhanceUtils.toBoolean(EnhanceUtils.java:173)
$IfBean_11.getCondition($IfBean_11.java)
org.apache.tapestry.components.IfBean.evaluateCondition(IfBean.java:128)
org.apache.tapestry.components.IfBean.renderComponent(IfBean.java:66)
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
org.apache.tapestry.components.IfBean.renderComponent(IfBean.java:94)
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
org.apache.tapestry.html.Body.renderComponent(Body.java:38)
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
org.apache.tapestry.html.Shell.renderComponent(Shell.java:124)
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:107)
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:107)
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:178)
org.apache.tapestry.AbstractPage.renderPage(AbstractPage.java:249)
org.apache.tapestry.engine.RequestCycle.renderPage(RequestCycle.java:397)
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderResponse(DefaultResponseBuilder.java:152)
org.apache.tapestry.services.impl.ResponseRendererImpl.renderResponse(ResponseRendererImpl.java:33)
$ResponseRenderer_113aeb80150.renderResponse($ResponseRenderer_113aeb80150.java)
$ResponseRenderer_113aeb8014f.renderResponse($ResponseRenderer_113aeb8014f.java)
org.apache.tapestry.engine.HomeService.service(HomeService.java:68)
$IEngineService_113aeb801c1.service($IEngineService_113aeb801c1.java)
org.apache.tapestry.services.impl.EngineServiceInnerProxy.service(EngineServiceInnerProxy.java:77)
org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:72)
org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:237)
org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54)
$WebRequestServicer_113aeb8019a.service($WebRequestServicer_113aeb8019a.java)
$WebRequestServicer_113aeb80199.service($WebRequestServicer_113aeb80199.java)
org.apache.tapestry.services.impl.DisableCachingFilter.service(DisableCachingFilter.java:105)
$WebRequestServicerFilter_113aeb8019c.service($WebRequestServicerFilter_113aeb8019c.java)
$WebRequestServicerFilter_113aeb8019b.service($WebRequestServicerFilter_113aeb8019b.java)
$WebRequestServicer_113aeb8019d.service($WebRequestServicer_113aeb8019d.java)
$WebRequestServicer_113aeb80196.service($WebRequestServicer_113aeb80196.java)
$WebRequestServicer_113aeb80195.service($WebRequestServicer_113aeb80195.java)
org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
$ServletRequestServicer_113aeb8017c.service($ServletRequestServicer_113aeb8017c.java)
$ServletRequestServicer_113aeb8017b.service($ServletRequestServicer_113aeb8017b.java)
org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
$ServletRequestServicerFilter_113aeb80178.service($ServletRequestServicerFilter_113aeb80178.java)
$ServletRequestServicerFilter_113aeb80177.service($ServletRequestServicerFilter_113aeb80177.java)
$ServletRequestServicer_113aeb8017d.service($ServletRequestServicer_113aeb8017d.java)
org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
$ServletRequestServicerFilter_113aeb80176.service($ServletRequestServicerFilter_113aeb80176.java)
$ServletRequestServicerFilter_113aeb80175.service($ServletRequestServicerFilter_113aeb80175.java)
$ServletRequestServicer_113aeb8017d.service($ServletRequestServicer_113aeb8017d.java)
org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
$ServletRequestServicerFilter_113aeb8017a.service($ServletRequestServicerFilter_113aeb8017a.java)
$ServletRequestServicerFilter_113aeb80179.service($ServletRequestServicerFilter_113aeb80179.java)
$ServletRequestServicer_113aeb8017d.service($ServletRequestServicer_113aeb8017d.java)
$ServletRequestServicer_113aeb80170.service($ServletRequestServicer_113aeb80170.java)
$ServletRequestServicer_113aeb8016f.service($ServletRequestServicer_113aeb8016f.java)
org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126)
org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103)
javax.servlet.http.HttpServlet.service(HttpServlet.java:596)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:428)
org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:473)
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:633)
org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
org.mortbay.http.HttpServer.service(HttpServer.java:909)
org.mortbay.http.HttpConnection.service(HttpConnection.java:820)
org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:986)
org.mortbay.http.HttpConnection.handle(HttpConnection.java:837)
org.mortbay.http.SocketListener.handleConnection(SocketListener.java:245)
org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)
Caused by: java.lang.RuntimeException: java.lang.NullPointerException
ognl.ASTMethod.toGetSourceString(ASTMethod.java:288)
ognl.ASTChain.toGetSourceString(ASTChain.java:273)
... 88 more
Caused by: java.lang.NullPointerException
ognl.ASTMethod.toGetSourceString(ASTMethod.java:264)
... 89 more

Marco von Ballmoos - [10/Jul/07 07:52 AM ]
I just downloaded the source and had a look around. I managed to prevent the error by modifying the following code in ASTMethod.java (starting at line 264):

                        } else if ((NodeType.class.isInstance(_children[i])
                                && ((NodeType)_children[i]).getGetterClass() != null
                                && Number.class.isAssignableFrom(((NodeType)_children[i]).getGetterClass()))
                                || (valueClass != null) && valueClass.isPrimitive()) {

                            parmString = " ($w) " + parmString;
                        } else if ((valueClass != null) && valueClass.isPrimitive()) {
                            parmString = "($w) " + parmString;
                        }

Both checks for "(valueClass != null)" are new. The logic above does not prevent "value" from being null, but I have no idea whether this is true or not. Suffice it to say that my code *seems* to be working now, but it would be great if you take a look at this are to determine what the real fix should be.

Thanks!