Project: Eclipse_Platform_UI
Bug 142299 [JFace] Class Dialog cannot be loaded in non-UI thread
Reported: 2006-05-17 14:08:45 | Status: verified fixed

The static initializer of org.eclipse.jface.dialogs.Dialog cannot be executed in a non-UI thread. The problematic call-chain is: JFaceResources.getImageRegistry() -> Display.getCurrent(). In a non-UI thread this returns null, causing an NPE in the static initializer. As the result, this class fails to load. I stumbled over this because I wanted to perform aspect weaving (using the new hooks in the OSGI) on a subclass of Dialog. For that purpose I had to force loading these classes from infrastructure code, perhaps even before the UI was up and running. Another (hypothetical) scenario where this will cause problems would be a configurable factory, which could be programmed like this: Class myDialogClass; void init() { myDialogClass = Class.forName(readDialogClassName()); } Dialog createDialog() { return (Dialog)myDialogClass.newInstance(); } Also in this case method init() would crash if invoked within a non-UI thread. IMHO, a static initializer should never make any assumptions about the context it is being executed in. The code in question seems to exist for backward compatibility only. (Typo in javadoc: @see Display#getSystemIcon(int ID), should read: getSystemImage, the same typo in ImageRegistry.get()). In fact ImageRegistry.get(String) re-maps the deprecated keys from Dialog to the new ones in SWT, so I believe the code in the static initializer has not even any effect, the entries entered into the image registry will never be retrieved by that name. Correct me if I'm wrong.

Files changed in fix:
bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/Dialog.java bundles/org.eclipse.jface/src/org/eclipse/jface/resource/JFaceResources.java bundles/org.eclipse.jface/src/org/eclipse/jface/wizard/Wizard.java