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

Reply via email to