myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Leonardo Uribe (JIRA)" <...@myfaces.apache.org>
Subject [jira] Commented: (MYFACES-2561) StackOverflowError if a composite component implementation uses another composite component
Date Wed, 17 Feb 2010 18:56:27 GMT

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


Mime
View raw message