We have another ognl problem with Tapestry 4.1.2.

We use the expression "ognl:ordersPerShopLoop.index % 2 == 0" (for even/odd 
style in a table)
and get the following error (see below). Any hints how to prevent this or how 
we have to rewrite the 
above ognl expression?

Thanks, Max


2007-06-27 18:16:59,906 ERROR HiveMindExpressionCompiler.java:176 - Error 
generating OGNL getter for expression (ordersPerShopLoop.index % 2) == 0 with 
root [EMAIL PROTECTED]/OrderStatusListPage] and body:
{ return  ($w) ((ognl.OgnlOps.remainder( ($w) 
(($OrderStatusListPage_27)$2).getOrdersPerShopLoop().getIndex(), ($w) 2) == 
0));}
org.apache.hivemind.ApplicationRuntimeException: Unable to add method 
java.lang.Object get(ognl.OgnlContext, java.lang.Object) to class 
$ASTEq_1136df7c1da: [source error] invalid types for ==
        at 
org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:278)
        at 
org.apache.tapestry.services.impl.HiveMindExpressionCompiler.compileExpression(HiveMindExpressionCompiler.java:172)
        at ognl.OgnlRuntime.compileExpression(OgnlRuntime.java:498)
        at ognl.Ognl.compileExpression(Ognl.java:141)
        at 
org.apache.tapestry.services.impl.ExpressionCacheImpl.parse(ExpressionCacheImpl.java:152)
        at 
org.apache.tapestry.services.impl.ExpressionCacheImpl.getCompiledExpression(ExpressionCacheImpl.java:115)
        at 
$ExpressionCache_1136df7c14c.getCompiledExpression($ExpressionCache_1136df7c14c.java)
        at 
org.apache.tapestry.binding.ExpressionBinding.resolveExpression(ExpressionBinding.java:134)
        at 
org.apache.tapestry.binding.ExpressionBinding.getObject(ExpressionBinding.java:125)
        at 
org.apache.tapestry.binding.AbstractBinding.getObject(AbstractBinding.java:84)
        at 
org.apache.tapestry.enhance.EnhanceUtils.toBoolean(EnhanceUtils.java:173)
        at $IfBean_4.getCondition($IfBean_4.java)
        at 
org.apache.tapestry.components.IfBean.evaluateCondition(IfBean.java:138)
        at org.apache.tapestry.components.IfBean.renderComponent(IfBean.java:66)
        at 
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
        at 
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
        at 
org.apache.tapestry.components.ForBean.renderComponent(ForBean.java:181)
        at 
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
        at 
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
        at 
org.apache.tapestry.components.ForBean.renderComponent(ForBean.java:181)
        at 
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
        at 
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
        at 
org.apache.tapestry.form.FormSupportImpl.render(FormSupportImpl.java:502)
        at org.apache.tapestry.form.Form.renderComponent(Form.java:217)
        at 
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
        at 
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
        at org.apache.tapestry.html.Body.renderComponent(Body.java:38)
        at 
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
        at 
org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:539)
        at org.apache.tapestry.html.Shell.renderComponent(Shell.java:124)
        at 
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:180)
        at 
org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:107)
        at 
org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:725)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:178)
        at org.apache.tapestry.AbstractPage.renderPage(AbstractPage.java:249)
        at 
org.apache.tapestry.engine.RequestCycle.renderPage(RequestCycle.java:397)
        at 
org.apache.tapestry.services.impl.DefaultResponseBuilder.renderResponse(DefaultResponseBuilder.java:152)
        at 
org.apache.tapestry.services.impl.ResponseRendererImpl.renderResponse(ResponseRendererImpl.java:33)
        at 
$ResponseRenderer_1136df7c023.renderResponse($ResponseRenderer_1136df7c023.java)
        at org.apache.tapestry.engine.PageService.service(PageService.java:68)
        at $IEngineService_1136df7c091.service($IEngineService_1136df7c091.java)
        at 
org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:72)
        at 
org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:237)
        at 
org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54)
        at 
$WebRequestServicer_1136df7c06d.service($WebRequestServicer_1136df7c06d.java)
        at 
$WebRequestServicer_1136df7c069.service($WebRequestServicer_1136df7c069.java)
        at 
org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
        at 
$ServletRequestServicer_1136df7c04f.service($ServletRequestServicer_1136df7c04f.java)
        at 
org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
        at 
$ServletRequestServicerFilter_1136df7c04b.service($ServletRequestServicerFilter_1136df7c04b.java)
        at 
$ServletRequestServicer_1136df7c051.service($ServletRequestServicer_1136df7c051.java)
        at 
org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
        at 
$ServletRequestServicerFilter_1136df7c049.service($ServletRequestServicerFilter_1136df7c049.java)
        at 
$ServletRequestServicer_1136df7c051.service($ServletRequestServicer_1136df7c051.java)
        at 
org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
        at 
$ServletRequestServicerFilter_1136df7c04d.service($ServletRequestServicerFilter_1136df7c04d.java)
        at 
$ServletRequestServicer_1136df7c051.service($ServletRequestServicer_1136df7c051.java)
        at 
$ServletRequestServicer_1136df7c043.service($ServletRequestServicer_1136df7c043.java)
        at 
org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126)
        at 
org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
        at 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at 
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at 
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at 
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at 
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Unknown Source)
Caused by: javassist.CannotCompileException: [source error] invalid types for ==
        at javassist.CtBehavior.setBody(CtBehavior.java:347)
        at javassist.CtBehavior.setBody(CtBehavior.java:316)
        at 
org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:272)
        ... 85 more
Caused by: compile error: invalid types for ==
        at javassist.compiler.CodeGen.badTypes(CodeGen.java:1242)
        at javassist.compiler.CodeGen.convertOprandTypes(CodeGen.java:1303)
        at javassist.compiler.CodeGen.compareExpr(CodeGen.java:1193)
        at javassist.compiler.CodeGen.booleanExpr(CodeGen.java:1091)
        at javassist.compiler.CodeGen.atBinExpr(CodeGen.java:971)
        at javassist.compiler.ast.BinExpr.accept(BinExpr.java:40)
        at javassist.compiler.JvstCodeGen.atCastToWrapper(JvstCodeGen.java:201)
        at javassist.compiler.JvstCodeGen.atCastExpr(JvstCodeGen.java:171)
        at javassist.compiler.ast.CastExpr.accept(CastExpr.java:54)
        at javassist.compiler.CodeGen.compileExpr(CodeGen.java:223)
        at javassist.compiler.CodeGen.atReturnStmnt2(CodeGen.java:591)
        at javassist.compiler.JvstCodeGen.atReturnStmnt(JvstCodeGen.java:424)
        at javassist.compiler.CodeGen.atStmnt(CodeGen.java:356)
        at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
        at javassist.compiler.CodeGen.atStmnt(CodeGen.java:344)
        at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
        at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:285)
        at javassist.compiler.Javac.compileBody(Javac.java:212)
        at javassist.CtBehavior.setBody(CtBehavior.java:341)
        ... 87 more

> -----Ursprüngliche Nachricht-----
> Von: Kalle Korhonen [mailto:[EMAIL PROTECTED] 
> Gesendet: Mittwoch, 27. Juni 2007 00:26
> An: Tapestry users
> Betreff: OGNL 2.7 Must use #this
> 
> Hi Jesse et al,
> 
> while trying to migrate to Tap 4.1.2 we started getting lots 
> of OgnlExceptions with message "source is null" from 
> OgnlRuntime.getProperty.
> The workaround was to add #this to a lot of places where we 
> used more complex OGNL expressions. I realize this is 
> probably much more to do with enhanced Ognl than Tapestry, so 
> I would have taken the discussion to ognl list, but 
> subscribing to ognl-interest failed with lists.ognl.org 
> domain not found. Anyway, an example of failing expression is:
> ognl:object[linkProperty]
> 
> that now only works with:
> ognl:object[#this.linkProperty]
> 
> Without knowing anything about how compiled OGNL works, just 
> following the ExpressionEvaluatorImpl.java source I tried to 
> make a test case that fails:
>     public String getKey() {
>         return "key";
>     }
> 
>     public void testEnhancedOgnl() throws Exception {
>         map = new HashMap();
>         map.put("key", "value");
>         ClassResolver ognlResolver = new OgnlClassResolver();
>         OgnlContext context = 
> (OgnlContext)Ognl.createDefaultContext(this,
> ognlResolver);
>         Node expression = Ognl.compileExpression(context, map, "key");
>         assertEquals(map.get("key"), 
> Ognl.getValue(expression.getAccessor(),
> context, map)) ;
> 
>         context = (OgnlContext)Ognl.createDefaultContext(this,
> ognlResolver);
>         expression = Ognl.compileExpression(context, this, 
> "#this[key]");
>         assertEquals("key", 
> Ognl.getValue(expression.getAccessor(), context,
> this)) ;
> 
>         context = (OgnlContext)Ognl.createDefaultContext(this,
> ognlResolver);
>         expression = Ognl.compileExpression(context, this, 
> "#this.key");
>         assertEquals("key", 
> Ognl.getValue(expression.getAccessor(), context,
> this)) ;
> 
>         // Fails
>         context = (OgnlContext)Ognl.createDefaultContext(this,
> ognlResolver);
>         expression = Ognl.compileExpression(context, this, "key");
>         assertEquals("key", 
> Ognl.getValue(expression.getAccessor(), context,
> this)) ;
>     }
> 
> 
> I might be way off here (like I said, I don't know anything 
> about it :), but the last assert fails (on 
> CannotCompileException) even though to me the expression is 
> equal to the two above it (the first one's just me figuring 
> out how it works).
> 
> Since 2.7 is already released and I can see Jesse has even 
> tagged Tap4.1.2 a few hours ago, I was mostly looking for a 
> quick explanation, maybe a better workaround if possible. If 
> this (pun intended) is the price to pay for faster OGNL, 
> here's my check and huge thanks to Jesse for all the hard work!
> 
> Kalle
> 

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

Reply via email to