[ https://issues.apache.org/jira/browse/MYFACES-2561?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12834930#action_12834930 ]
Leonardo Uribe commented on MYFACES-2561: ----------------------------------------- The problem with this fix is how to "resolve" #{cc} object. We need a way to lookup it based on the document markup, but the problem is that the evaluation of the expression happens after the tree is build. So, we need to find a way to "preserve" or find this information on that time. We can't use the component clientId, because it is not safe to call getClientId while the tree is build. Note to identify a target component used by cc:insertChildren or cc:insertFacet we can use it because the code that call it are on the listener activated when PostAddToView is called, that means after the tree is build. One idea could be use the fact that cc:implementation put all component under UIComponent.COMPOSITE_FACET_NAME key, trying to find the closest one in the hierarchy, but this fact fails under the presence of cc:insertChildren or cc:insertFacet. Note cc:insertChildren or cc:insertFacet relocate components but the parent composite component is still on the hierarchy. In theory, the only thing we have to identify or know the structure or a composite component is UIComponent.BEANINFO_KEY or Resource.COMPONENT_RESOURCE_KEY, so maybe we could take advantage of this fact to identify which composite component in the hierarchy is the one we are referring to #{cc}, but still I'm not have clear how we can do that. The spec says the EL resolver that try to get #{cc} (in myfaces it is org.apache.myfaces.el.unified.resolver.implicitobject.CompositeComponentImplicitObject) should return the value of UIComponent.getCurrentCompositeComponent(facesContext). But probably this behavior could change to make this fix work, breaking the spec. Again, as in MYFACES-2553, we need to do something from TagAttributeImpl. 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.