[ 
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.

Reply via email to