Bug 142299 [JFace] Class Dialog cannot be loaded in non-UI thread
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.
bundles/org.eclipse.jface/src/org/eclipse/jface/dialogs/Dialog.java
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
 * A dialog is a specialized window used for narrow-focused communication with
 * the user.
 * <p>
 * Dialogs are usually modal. Consequently, it is generally bad practice to open
 * a dialog without a parent. A modal dialog without a parent is not prevented
 * from disappearing behind the application's other windows, making it very
 * confusing for the user.
 * </p>
 * <p>
 * If there is more than one modal dialog is open the second one should be
 * parented off of the shell of the first one otherwise it is possible that the
 * OS will give focus to the first dialog potentially blocking the UI.
 * </p>
 */
public abstract class Dialog extends Window {