[ 
https://issues.apache.org/jira/browse/NETBEANS-3196?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eirik Bakke resolved NETBEANS-3196.
-----------------------------------
    Resolution: Fixed

PR was merged; marking resolved.

> Calling Children.LEAF.getNodesCount() changes lazy loading behavior globally
> ----------------------------------------------------------------------------
>
>                 Key: NETBEANS-3196
>                 URL: https://issues.apache.org/jira/browse/NETBEANS-3196
>             Project: NetBeans
>          Issue Type: Improvement
>          Components: platform - Nodes
>    Affects Versions: 11.0
>            Reporter: Eirik Bakke
>            Priority: Minor
>              Labels: pull-request-available
>          Time Spent: 1h 50m
>  Remaining Estimate: 0h
>
> There's a small bug in org.openide.nodes.Node.setChildren(Children). The 
> logic goes something like this:
> {code:java}
> protected final void setChildren(final Children ch) {
>   boolean wasInited = hierarchy.isInitialized();
>   boolean wasLeaf = hierarchy == Children.LEAF;
>   // ...
>   hierarchy = ch;
>   // ...
>   if (wasInited && hierarchy != Children.LEAF) {
>       // init new children if old was inited
>       hierarchy.getNodesCount();
> {code}
> If a Node's children was originally Children.LEAF, and is then changed to a 
> different instance, the resulting behavior now becomes dependent on the 
> result of Children.LEAF.isInitialized(). The latter is a global piece of 
> state which may return false for a long time until _any_ module anywhere in 
> the IDE or in a platform application calls Children.LEAF.getNodesCount(), 
> after which Children.LEAF.isInitialized() will forever after return true.
> Once Children.LEAF.getNodesCount() has been called, from any module, Node 
> implementations that switch from Children.LEAF to another Children 
> implementation will no longer get lazy loading behavior.
> The fix is simple; the condition should be "wasInited && !wasLeaf && 
> hierarchy != Children.LEAF)".
> It might be good to ensure that Children.LEAF is always initialized as well, 
> to prevent accidentally sharing mutable global state. (Actually, I tried 
> calling Children.LEAF.getNodesCount() on LEAF's initial construction, but 
> this caused a failure on startup. So don't bother.)
> (This bug was found in a NetBeans Platform application that relies heavily on 
> lazy loading of nodes.)



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to