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