myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrei Zhemaituk (JIRA)" <...@myfaces.apache.org>
Subject [jira] [Commented] (MYFACES-3739) @ResourceDependency annotation + JSF 1.2 state saving + c:if (dynamic section) creates components on each click (UIViewRoot grows)
Date Tue, 25 Jun 2013 21:39:20 GMT

    [ https://issues.apache.org/jira/browse/MYFACES-3739?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13693401#comment-13693401
] 

Andrei Zhemaituk commented on MYFACES-3739:
-------------------------------------------

Leonardo,
Thanks for quick feedback and great problem analysis!.
I have tried the patch and the issue is not reproducible with either RichFaces example (RF-13025)
or pure myfaces example (with c:if one).
Just a note that the issue is much easier to reproduce with RichFaces. Just having a4j:ajax
on page is enough (its tag handler calls Application#createBehavior on every build tree which
in turn process AjaxBehaviorRenderer's annotations), example is as simple as:
{code}
<h:form>
<h:commandButton value="Click Me">
    <a4j:ajax execute="@this" render="@this"/>
</h:commandButton>
</h:form>
{code}

With the patch there is still an issue when there are different components referencing the
same resource. It does not cause memory leak but still keeps some resource duplicates (one
per component class).

{code}
<h:form>
    <h:commandButton value="Toggle" action="#{sessionScopedBean.togglePanelShown}">
        <f:ajax execute="@this" render="group"/>
    </h:commandButton>

    <custom:componentWithResourceDependency/>
    <h:panelGroup id="group">
        <c:if test="#{sessionScopedBean.panelShown}">
            #{sessionScopedBean.panelShown}
            <custom:anotherComponentWithSameResourceDependency/>
        </c:if>
    </h:panelGroup>
</h:form>
{code}

If the panel is initially shown (both components are in the tree) - resource (UIOutput) gets
added only once to the tree.
If the panel is not shown - resource gets added, after clicking the button - resource gets
added once again.

I guess it can be solved by storing added resource dependencies (org.apache.myfaces.context.RequestViewContext#addedResources)
in the same way as processed classes are stored in your solution. Probably it will add some
more of memory overhead (but it potentially saves some on eliminating duplicates). Also having
added resource dependencies saved removes the need of having processed classes stored, not
keeping processed classes would save the mentioned by you 80-150 bytes but will add I guess
a bit of CPU overhead on every request for reading classes annotations.
                
> @ResourceDependency annotation + JSF 1.2 state saving + c:if (dynamic section) creates
components on each click (UIViewRoot grows)
> ----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MYFACES-3739
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3739
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-314
>    Affects Versions: 2.1.12
>         Environment: myfaces 2.1.12
> Tomcat 6.0.36
>            Reporter: Andrei Zhemaituk
>         Attachments: MYFACES-3739-1.patch
>
>
> The issue was initially reported against RichFaces: https://issues.jboss.org/browse/RF-13025
> But it does not look like it is anything wrong with RichFaces here.
> The issue is reproducible with pure myfaces when partial state saving is turned OFF e.g.
with the following code (every second click on "Toggle" button causes new UIOutput element
to be inserted to the view tree):
> {code}
>   <h:form>
>     <h:commandButton value="Toggle" action="#{bean.togglePanelShown}">
>       <f:ajax execute="@this" render="group"/>
>     </h:commandButton>
>     <h:panelGroup id="group">
>       <c:if test="#{bean.panelShown}">
>         <!-- Any component with @ResourceDependency annotation. -->
>         <custom:componentWithResourceDependency/>
>       </c:if>
>     </h:panelGroup>
>   </h:form>
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message