[ https://issues.apache.org/jira/browse/MYFACES-2561?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12834993#action_12834993 ]
Leonardo Uribe commented on MYFACES-2561: ----------------------------------------- Thinking more about it, is clear org.apache.myfaces.el.unified.resolver.implicitobject.CompositeComponentImplicitObject must be changed and some hack should be implemented there. That's why the change on JSF 2.0 Rev A Change Log says something about Modify table 5-10. Really the complete reference is: - JSF 2.0 spec section 5.6.2.1 Implicit Object ELResolver for Facelets and Programmatic Access section TABLE 5-10 ImplicitObjectELResolver for Programmatic Access One idea to resolve #{cc} is the following: 1. When TagAttributeImpl.getValueExpression(FaceletContext ctx, Class type) is called (from ComponentRule.ValueExpressionMetadata or other place) check if the constructed expression requires resolve a reference to "cc". If so, save the data required to find the real composite component reference, wrapping the value expression like we did on MYFACES-2553. 2. When a method like ValueExpression.getValue(ELContext) or something similar is called, put somewhere (facesContext attribute map?) the information required, so when the original value expression is called and "cc" is resolved, we can extract that information and resolve the component value correctly. One idea could be use ComponentSupport.MARK_CREATED attribute to identify the component we need and iterate through hierarchy using UIComponent.getCurrentComponent(FacesContext) and UIComponent.getCompositeComponentParent(UIComponent). This two methods uses Resource.COMPONENT_RESOURCE_KEY implicit to recognize a composite component. ComponentSupport.MARK_CREATED key is used by ComponentTagHandlerDelegate to mark a component to a specific tag instance. Suggestions are welcome. > StackOverflowError if a composite component implementation uses another > composite component > ------------------------------------------------------------------------------------------- > > Key: MYFACES-2561 > URL: https://issues.apache.org/jira/browse/MYFACES-2561 > Project: MyFaces Core > Issue Type: Bug > Components: JSR-314 > Affects Versions: 2.0.0-beta-3 > Reporter: Jakob Korherr > Assignee: Jakob Korherr > > If you use another composite component in your composite component's > implementation you will get a StackOverflowError. > javax.faces.FacesException: java.lang.StackOverflowError > at > org.apache.myfaces.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241) > at > org.apache.myfaces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156) > at > org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:216) > at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) > at > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) > at > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) > at > org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) > at java.lang.Thread.run(Thread.java:637) > Caused by: java.lang.StackOverflowError > at java.util.ArrayList.toArray(ArrayList.java:306) > at java.util.logging.Logger.getHandlers(Logger.java:1200) > at > java.util.logging.LogManager$RootLogger.getHandlers(LogManager.java:1019) > at java.util.logging.Logger.log(Logger.java:454) > at java.util.logging.Logger.doLog(Logger.java:480) > at java.util.logging.Logger.logp(Logger.java:680) > at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:167) > at org.apache.juli.logging.DirectJDKLog.error(DirectJDKLog.java:135) > at org.apache.catalina.connector.Request.setAttribute(Request.java:1448) > at > org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:503) > at > org.apache.myfaces.context.servlet.RequestMap.setAttribute(RequestMap.java:53) > at > org.apache.myfaces.util.AbstractAttributeMap.put(AbstractAttributeMap.java:113) > at > org.apache.myfaces.util.AbstractAttributeMap.put(AbstractAttributeMap.java:1) > at > org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.setScope(FacesCompositeELResolver.java:191) > at > org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:139) > at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:61) > at org.apache.el.parser.AstValue.getValue(AstValue.java:107) > at > org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) > at > org.apache.myfaces.view.facelets.el.TagValueExpression.getValue(TagValueExpression.java:84) > at > org.apache.myfaces.el.unified.resolver.CompositeComponentELResolver$CompositeComponentAttributesMapWrapper.get(CompositeComponentELResolver.java:245) > at javax.el.MapELResolver.getValue(MapELResolver.java:51) > at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) > at > org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:140) > at org.apache.el.parser.AstValue.getValue(AstValue.java:118) > at > org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) > at > org.apache.myfaces.view.facelets.el.TagValueExpression.getValue(TagValueExpression.java:84) > at > org.apache.myfaces.el.unified.resolver.CompositeComponentELResolver$CompositeComponentAttributesMapWrapper.get(CompositeComponentELResolver.java:245) > at javax.el.MapELResolver.getValue(MapELResolver.java:51) > at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) > at > org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:140) > at org.apache.el.parser.AstValue.getValue(AstValue.java:118) > at > org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) > at > org.apache.myfaces.view.facelets.el.TagValueExpression.getValue(TagValueExpression.java:84) > at > org.apache.myfaces.el.unified.resolver.CompositeComponentELResolver$CompositeComponentAttributesMapWrapper.get(CompositeComponentELResolver.java:245) > at javax.el.MapELResolver.getValue(MapELResolver.java:51) > at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) > at > org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:140) > at org.apache.el.parser.AstValue.getValue(AstValue.java:118) > at > org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) > at > org.apache.myfaces.view.facelets.el.TagValueExpression.getValue(TagValueExpression.java:84) > at > org.apache.myfaces.el.unified.resolver.CompositeComponentELResolver$CompositeComponentAttributesMapWrapper.get(CompositeComponentELResolver.java:245) > at javax.el.MapELResolver.getValue(MapELResolver.java:51) > at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54) > at > org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:140) > at org.apache.el.parser.AstValue.getValue(AstValue.java:118) > ...... > ...... -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.