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