This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 150013

Summary: Open projects dialog blocked at computing icon size
Product: projects Reporter: Jaroslav Tulach <jtulach>
Component: Generic Projects UIAssignee: Milan Kubec <mkubec>
Status: RESOLVED DUPLICATE    
Severity: blocker    
Priority: P3    
Version: 6.x   
Hardware: All   
OS: All   
Issue Type: DEFECT Exception Reporter:

Description Jaroslav Tulach 2008-10-14 08:18:50 UTC
With cold caches opening of projects dialog with root being root of NetBeans Hg repository blocks AWT for ages. From 
the attached thread dump it seems that the time is wasted in waiting for icon to compute the proper size. Maybe direct 
use of fixed height cache could help...

"AWT-EventQueue-1" prio=10 tid=0x08168000 nid=0x3253 runnable [0x8c0d0000..0x8c0d2020]
   java.lang.Thread.State: RUNNABLE
        at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
        at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:228)
        at java.io.File.isFile(File.java:778)
        at 
org.netbeans.modules.project.ant.AntBasedProjectFactorySingleton.isProject(AntBasedProjectFactorySingleton.java:150)
        at org.netbeans.api.project.ProjectManager.checkForProject(ProjectManager.java:473)
        at org.netbeans.api.project.ProjectManager.access$600(ProjectManager.java:80)
        at org.netbeans.api.project.ProjectManager$4.run(ProjectManager.java:443)
        at org.netbeans.api.project.ProjectManager$4.run(ProjectManager.java:418)
        at org.openide.util.Mutex.readAccess(Mutex.java:327)
        at org.openide.util.Mutex$1R.run(Mutex.java:1299)
        at org.netbeans.api.project.ProjectManager$2$1.run(ProjectManager.java:120)
        at org.openide.filesystems.EventControl.runAtomicAction(EventControl.java:120)
        at org.openide.filesystems.FileSystem.runAtomicAction(FileSystem.java:499)
        at org.openide.filesystems.FileUtil.runAtomicAction(FileUtil.java:216)
        at org.netbeans.api.project.ProjectManager$2.execute(ProjectManager.java:118)
        at org.openide.util.Mutex.doWrapperAccess(Mutex.java:1320)
        at org.openide.util.Mutex.readAccess(Mutex.java:275)
        at org.netbeans.api.project.ProjectManager.isProject(ProjectManager.java:417)
        at org.netbeans.modules.project.ui.ProjectChooserAccessory.isProjectDir(ProjectChooserAccessory.java:359)
        at org.netbeans.modules.project.ui.ProjectChooserAccessory.access$800(ProjectChooserAccessory.java:86)
        at 
org.netbeans.modules.project.ui.ProjectChooserAccessory$ProjectFileView.getIcon(ProjectChooserAccessory.java:590)
        at javax.swing.JFileChooser.getIcon(JFileChooser.java:1535)
        at 
org.netbeans.swing.dirchooser.DirectoryChooserUI$DirectoryTreeRenderer.getNodeIcon(DirectoryChooserUI.java:2346)
        at 
org.netbeans.swing.dirchooser.DirectoryChooserUI$DirectoryTreeRenderer.getTreeCellRendererComponent(DirectoryChooserUI.java:2330)
        at javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimensions(BasicTreeUI.java:2709)
        at javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayoutCache.java:475)
        at 
javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.updatePreferredSize(VariableHeightLayoutCache.java:1342)
        at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.expand(VariableHeightLayoutCache.java:1469)
        at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.expand(VariableHeightLayoutCache.java:1270)
        at javax.swing.tree.VariableHeightLayoutCache.rebuild(VariableHeightLayoutCache.java:725)
        at javax.swing.tree.VariableHeightLayoutCache.setModel(VariableHeightLayoutCache.java:91)
        at javax.swing.plaf.basic.BasicTreeUI.setModel(BasicTreeUI.java:398)
        at javax.swing.plaf.basic.BasicTreeUI$Handler.propertyChange(BasicTreeUI.java:3322)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
        at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
        at java.awt.Component.firePropertyChange(Component.java:7868)
        at javax.swing.JTree.setModel(JTree.java:863)
        at org.netbeans.swing.dirchooser.DirectoryChooserUI$12.run(DirectoryChooserUI.java:1084)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:177)
        at java.awt.Dialog$1.run(Dialog.java:1045)
        at java.awt.Dialog$3.run(Dialog.java:1097)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Dialog.show(Dialog.java:1095)
        at javax.swing.JFileChooser.showDialog(JFileChooser.java:723)
        at javax.swing.JFileChooser.showOpenDialog(JFileChooser.java:626)
        at org.netbeans.modules.project.ui.actions.OpenProject.actionPerformed(OpenProject.java:101)
        at org.openide.windows.TopComponent.processKeyBinding(TopComponent.java:1007)
        at javax.swing.JComponent.processKeyBindings(JComponent.java:2895)
        at javax.swing.JComponent.processKeyEvent(JComponent.java:2812)
        at java.awt.Component.processEvent(Component.java:5818)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4413)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
        at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:697)
        at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:962)
        at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:834)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:661)
        at java.awt.Component.dispatchEventImpl(Component.java:4285)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Window.dispatchEventImpl(Window.java:2440)
        at java.awt.Component.dispatchEvent(Component.java:4243)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Comment 1 Milos Kleint 2008-10-14 09:13:11 UTC
what part of the stacktrace leads you to believe it has to do with icon size?

IMHO it's actuall the project loading that needs to be performed in order to retrieve the ProjectInformation from
project's lookup that takes time.

Ideally the icons would be an attribute of the ProjectFactory and only ProjectFactory.isProject() gets called. However
it won't work for ant projects easily as these all share a single factory. To figure which of teh ant project types is
actually used one has to examine the nbproject/project.xml file and find the appropriate project type impl. 
Comment 2 Jaroslav Tulach 2008-10-14 09:54:24 UTC
Imho:
javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimensions(BasicTreeUI.java:2709)
means that the JTree is just layouting all its nodes before doing first paint.

As far as I can see the actual behaviour, the choose is shown with default folder icon and only later the correct 
project icons are computed. This is plausible, however the above stacktrace shows that we also need to eliminate the 
query to project system when computing getNodeDimentions.
Comment 3 Milan Kubec 2009-09-15 14:20:29 UTC
I don't see any delay when opening projects open dialog for NetBeans Hg repository. If there is some problem we would
receive "AWT thread blocked for ..." issue report. Let's wait for such report.
Comment 4 Jaroslav Tulach 2009-09-16 07:20:05 UTC
I think this is a duplicate of a bug recently analysed by Tomáš Pávek.
Comment 5 Jaroslav Tulach 2009-09-16 07:20:57 UTC

*** This issue has been marked as a duplicate of 169303 ***