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

Key: OGNL-115
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Jesse Kuhnert
Reporter: Kalle Korhonen
Votes: 1
Watchers: 2
Operations

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

Setting a property fails if setter isn't implemented in the same interface as the getter

Created: 12/Aug/07 11:55 PM   Updated: 11/Feb/08 03:24 PM
Component/s: ExpressionCompiler
Affects Version/s: 2.7.1
Fix Version/s: 2.7.3

File Attachments: 1. Java Source File OgnlTest.java (3 kb)

Environment: Tapestry 4.1.2 with ognl-2.7.1-20070723.185910-9 (the newer 200708xx snapshots didn't work for me)


 Description  « Hide
Not sure how to implement a valid unit test; hopefully in this case the stack trace with the exception below is enough to desribe the problem. I have a User object that implements Acegi's UserDetails that contains several isPropertyXXX() methods, such as boolean isAccountNonLocked() below. There's no corresponding setAccountNonLocked() in the UserDetails interface, but the User object implements both operations. I'm displaying their properties in a Tapestry contrib table. For each property that doesn't have a set operation defined in the interface, I'm getting an exception trace similar to the one below:

Caused by: javassist.CannotCompileException: [source error] setAccountNonLocked(boolean) not found in org.acegisecurity.userdetails.UserDetails
at javassist.CtBehavior.setBody(CtBehavior.java:347)
at javassist.CtBehavior.setBody(CtBehavior.java:316)
at org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:272)
... 161 more
Caused by: compile error: setAccountNonLocked(boolean) not found in org.acegisecurity.userdetails.UserDetails
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:716)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:235)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:323)
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)
... 163 more
org.apache.hivemind.ApplicationRuntimeException: Unable to add method void set(ognl.OgnlContext, java.lang.Object, java.lang.Object) to class $ASTProperty_1145d73cf1a: [source error] setAccountNonLocked(boolean) not found in org.acegisecurity.userdetails.UserDetails
at org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:278)
at org.apache.tapestry.services.impl.HiveMindExpressionCompiler.compileExpression(HiveMindExpressionCompiler.java:214)
at ognl.OgnlRuntime.compileExpression(OgnlRuntime.java:524)
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_1145d73ce35.getCompiledExpression($ExpressionCache_1145d73ce35.java)
at org.apache.tapestry.services.impl.ExpressionEvaluatorImpl.read(ExpressionEvaluatorImpl.java:108)
at $ExpressionEvaluator_1145d73ce33.read($ExpressionEvaluator_1145d73ce33.java)
at org.apache.tapestry.contrib.table.model.ognl.OgnlTableColumnEvaluator.getColumnValue(OgnlTableColumnEvaluator.java:59)
at org.apache.tapestry.contrib.table.model.simple.SimpleTableColumn.getColumnValue(SimpleTableColumn.java:211)
at org.trails.component.TrailsTableColumn.getColumnValue(TrailsTableColumn.java:52)
at org.apache.tapestry.contrib.table.model.simple.SimpleTableValueRendererSource.getRenderer(SimpleTableValueRendererSource.java:56)
at org.apache.tapestry.contrib.table.model.common.AbstractTableColumn.getValueRenderer(AbstractTableColumn.java:173)
at org.trails.component.TrailsTableColumn.getValueRenderer(TrailsTableColumn.java:84)
at org.apache.tapestry.contrib.table.components.TableValues.getTableValueRenderer(TableValues.java:90)
at $ASTProperty_1145d73cf10.get($ASTProperty_1145d73cf10.java)
at org.apache.tapestry.services.impl.ExpressionEvaluatorImpl.read(ExpressionEvaluatorImpl.java:142)
at $ExpressionEvaluator_1145d73ce33.read($ExpressionEvaluator_1145d73ce33.java)
at org.apache.tapestry.binding.ExpressionBinding.resolveExpression(ExpressionBinding.java:139)
at org.apache.tapestry.binding.ExpressionBinding.getObject(ExpressionBinding.java:125)
at org.apache.tapestry.binding.AbstractBinding.getObject(AbstractBinding.java:84)
at $Delegator_96.getDelegate($Delegator_96.java)
at org.apache.tapestry.components.Delegator.renderComponent(Delegator.java:39)

 All   Comments   Change History      Sort Order:
Kalle Korhonen - [13/Aug/07 12:09 AM ]
Oh.. and forgot to mention that despite getting the stack traces, it still seems to work - maybe suggesting that the priority should be lowered.

Kalle Korhonen - [20/Sep/07 06:40 PM ]
Despite the fact I remember seeing at least one other person on tapestry users mailing that had experienced the same exact behavior, I now believe this bug report is invalid. I *do* see the issue when using Tapestry 4.1.2 with OGNL 2.7.1, but *not* with Tapestry 4.1.3. Obviously the newer Tapestry is doing something different - maybe just swallowing the exception trace? - but probably not worth your or my time to investigate further. Jesse, if you have a hunch on the cause, please provide closing comments.

Jesse Kuhnert - [18/Jan/08 03:10 PM ]
I'm assuming this problem has hopefully just "gone away". We'll see...

Matt Raible - [07/Feb/08 12:14 PM ]
I'm still seeing this issue with Tapestry 4.1.3 and OGNL 2.7.

ERROR [btpool0-3] HiveMindExpressionCompiler.compileExpression(224) | Error generating OGNL statements for expression username with root org.appfuse.model.User@99c678[username=admin,enabled=false,accountExpired=false,credentialsExpired=false,accountLocked=false,Granted Authorities: ]
org.apache.hivemind.ApplicationRuntimeException: Unable to add method void set(ognl.OgnlContext, java.lang.Object, java.lang.Object) to class $ASTProperty_117f4fc96d1: [source error] setUsername(java.lang.String) not found in org.acegisecurity.userdetails.UserDetails
        at org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:278)
        at org.apache.tapestry.services.impl.HiveMindExpressionCompiler.compileExpression(HiveMindExpressionCompiler.java:214)
        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_117f4fc9666.getCompiledExpression($ExpressionCache_117f4fc9666.java)
        at org.apache.tapestry.services.impl.ExpressionEvaluatorImpl.read(ExpressionEvaluatorImpl.java:108)
        at $ExpressionEvaluator_117f4fc9664.read($ExpressionEvaluator_117f4fc9664.java)
        at org.apache.tapestry.contrib.table.model.ognl.OgnlTableColumnEvaluator.getColumnValue(OgnlTableColumnEvaluator.java:59)
        at org.apache.tapestry.contrib.table.model.simple.SimpleTableColumn.getColumnValue(SimpleTableColumn.java:213)
        at org.apache.tapestry.contrib.table.model.simple.SimpleTableValueRendererSource.getRenderer(SimpleTableValueRendererSource.java:56)
        at org.apache.tapestry.contrib.table.model.common.AbstractTableColumn.getValueRenderer(AbstractTableColumn.java:177)

Here's my page template:

<table jwcid="table@contrib:Table" class="table contribTable" id="user"
    rowsClass="ognl:beans.rowsClass.next" row="ognl:row"
    columns="user.username:username, activeUsers.fullName:fullName"
    source="ognl:getServletContext().getAttribute('userNames')" initialSortColumn="username"
    arrowUpAsset="asset:upArrow" arrowDownAsset="asset:downArrow">
</table>

Jesse Kuhnert - [07/Feb/08 12:41 PM ]
Hmm....The root object being compiled against being "org.appfuse.model.User" and the error of not being able to call a setter on "org.acegisecurity.userdetails.UserDetails" sounds suspicious.

I don't know if you have the time / patience but it might help to have a sanity check and try ognl 2.7.2 and Tapestry 4.1.5-SNAPSHOT to be sure everything has the latest fixes.

OGNL 2.7.2 is relased and the released Tapestry 4.1.5 should show up in ibiblio Saturday. (vote ends tomorrow at which point I can do the actual release)

Matt Raible - [07/Feb/08 01:42 PM ]
I tried using Tapestry 4.1.3 and OGNL 2.7.2, but no dice. Where can I download a snapshot of Tapestry 4.1.5?


Matt Raible - [07/Feb/08 01:55 PM ]
I get the same error If I use Tapestry 4.1.5-SNAPSHOT and OGNL 2.7. If I upgrade to OGNL 2.7.2, I get the following error. My page still renders find, it's just errors from OGNL that show up in my log.

[INFO] Starting scanner at interval of 3 seconds.
ERROR [btpool0-1] HiveMindExpressionCompiler.compileExpression(224) | Error generating OGNL statements for expression dojoSource with root $Shell_1@d5bc3c1d[mainMenu/$Shell]
org.apache.hivemind.ApplicationRuntimeException: Unable to add method void set(ognl.OgnlContext, java.lang.Object, java.lang.Object) to class $ASTProperty_117f574eacf: [source error] ref1(ognl.OgnlContext,java.lang.Object,java.lang.Object) not found in $ASTProperty_117f574eacf
at org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:278)
at org.apache.tapestry.services.impl.HiveMindExpressionCompiler.compileExpression(HiveMindExpressionCompiler.java:214)
at ognl.OgnlRuntime.compileExpression(OgnlRuntime.java:414)
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_117f574eab2.getCompiledExpression($ExpressionCache_117f574eab2.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.bean.BindingBeanInitializer.setBeanProperty(BindingBeanInitializer.java:76)
at org.apache.tapestry.bean.BeanProvider.instantiateBean(BeanProvider.java:241)
at org.apache.tapestry.bean.BeanProvider.getBean(BeanProvider.java:158)
at org.apache.tapestry.binding.BeanBinding.getObject(BeanBinding.java:64)
at org.apache.tapestry.binding.AbstractBinding.getObject(AbstractBinding.java:84)
at $Shell_1.getAjaxDelegate($Shell_1.java)
at org.apache.tapestry.html.Shell.renderComponent(Shell.java:100)
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_117f574e988.renderResponse($ResponseRenderer_117f574e988.java)
at $ResponseRenderer_117f574e987.renderResponse($ResponseRenderer_117f574e987.java)
at org.apache.tapestry.engine.PageService.service(PageService.java:68)
at $IEngineService_117f574e9f5.service($IEngineService_117f574e9f5.java)
at org.apache.tapestry.services.impl.EngineServiceInnerProxy.service(EngineServiceInnerProxy.java:77)
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_117f574e9d2.service($WebRequestServicer_117f574e9d2.java)
at $WebRequestServicer_117f574e9d1.service($WebRequestServicer_117f574e9d1.java)
at $WebRequestServicer_117f574e9ce.service($WebRequestServicer_117f574e9ce.java)
at $WebRequestServicer_117f574e9cd.service($WebRequestServicer_117f574e9cd.java)
at org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
at $ServletRequestServicer_117f574e9b4.service($ServletRequestServicer_117f574e9b4.java)
at $ServletRequestServicer_117f574e9b3.service($ServletRequestServicer_117f574e9b3.java)
at org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
at $ServletRequestServicerFilter_117f574e9b0.service($ServletRequestServicerFilter_117f574e9b0.java)
at $ServletRequestServicerFilter_117f574e9af.service($ServletRequestServicerFilter_117f574e9af.java)
at $ServletRequestServicer_117f574e9b5.service($ServletRequestServicer_117f574e9b5.java)
at org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
at $ServletRequestServicerFilter_117f574e9ae.service($ServletRequestServicerFilter_117f574e9ae.java)
at $ServletRequestServicerFilter_117f574e9ad.service($ServletRequestServicerFilter_117f574e9ad.java)
at $ServletRequestServicer_117f574e9b5.service($ServletRequestServicer_117f574e9b5.java)
at org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
at $ServletRequestServicerFilter_117f574e9b2.service($ServletRequestServicerFilter_117f574e9b2.java)
at $ServletRequestServicerFilter_117f574e9b1.service($ServletRequestServicerFilter_117f574e9b1.java)
at $ServletRequestServicer_117f574e9b5.service($ServletRequestServicer_117f574e9b5.java)
at $ServletRequestServicer_117f574e9a8.service($ServletRequestServicer_117f574e9a8.java)
at $ServletRequestServicer_117f574e9a7.service($ServletRequestServicer_117f574e9a7.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:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:722)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:404)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:224)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at org.appfuse.webapp.filter.StaticFilter.doFilterInternal(StaticFilter.java:102)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:164)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:406)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.appfuse.webapp.filter.LocaleFilter.doFilterInternal(LocaleFilter.java:74)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at com.opensymphony.clickstream.ClickstreamFilter.doFilter(ClickstreamFilter.java:42)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:135)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149)
at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:722)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:404)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:828)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)
Caused by: javassist.CannotCompileException: [source error] ref1(ognl.OgnlContext,java.lang.Object,java.lang.Object) not found in $ASTProperty_117f574eacf
at javassist.CtBehavior.setBody(CtBehavior.java:367)
at javassist.CtBehavior.setBody(CtBehavior.java:334)
at org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:272)
... 120 more
Caused by: compile error: ref1(ognl.OgnlContext,java.lang.Object,java.lang.Object) not found in $ASTProperty_117f574eacf
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:716)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45)
at javassist.compiler.TypeChecker.atCastExpr(TypeChecker.java:546)
at javassist.compiler.JvstTypeChecker.atCastExpr(JvstTypeChecker.java:103)
at javassist.compiler.ast.CastExpr.accept(CastExpr.java:54)
at javassist.compiler.JvstTypeChecker.atMethodArgs(JvstTypeChecker.java:220)
at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:702)
at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681)
at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156)
at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45)
at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:241)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:329)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:350)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:291)
at javassist.compiler.Javac.compileBody(Javac.java:222)
at javassist.CtBehavior.setBody(CtBehavior.java:360)
... 122 more
ERROR [btpool0-1] HiveMindExpressionCompiler.compileExpression(224) | Error generating OGNL statements for expression dojoFormSource with root $Shell_1@d5bc3c1d[mainMenu/$Shell]
org.apache.hivemind.ApplicationRuntimeException: Unable to add method void set(ognl.OgnlContext, java.lang.Object, java.lang.Object) to class $ASTProperty_117f574ead0: [source error] ref1(ognl.OgnlContext,java.lang.Object,java.lang.Object) not found in $ASTProperty_117f574ead0
at org.apache.tapestry.enhance.ClassFabImpl.addMethod(ClassFabImpl.java:278)

Jesse Kuhnert - [07/Feb/08 02:06 PM ]
Is this happening in an app I can download and run myself ?

Kalle Korhonen - [07/Feb/08 03:18 PM ]
Yeah I can confirm I see the same exceptions as Matt using the same versions. I suppose it tries a compiled expression, fails and then runs it interpreted. I tried to create a unit test for it (created an interface with only a getter, implemented a setter in an implementing class), and I fully expected the compiled expression to fail, but it actually succeeds. I'll try tweaking the test to reproduce it, maybe Matt has a webapp available to demonstrate it.

Jesse Kuhnert - [07/Feb/08 03:23 PM ]
Hmm ok. I should be able to re-produce it with a test case then. I'll dig in further.

Kalle Korhonen - [07/Feb/08 03:55 PM ]
Ok, managed to create a test case that demonstrates the problem. Note that the result is different depending on the root object and that the same test succeeds if the "TestObject" doesn't implement "TestInterface".

Jesse Kuhnert - [11/Feb/08 03:24 PM ]
From the svn commit: " ASTConst needed to cause unsupported compilation exceptions to be thrown when the first stack member is a constant during setter generations as constants aren't obviously CONSTANT and not changeable. "

Deployed as OGNL 2.7.3-SNAPSHOT on http://opencomponentry.com/repository/m2-snapshot-repo/ .