Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 341816 - NPE executing a Job
Summary: NPE executing a Job
Status: RESOLVED FIXED
Alias: None
Product: RAP
Classification: RT
Component: Workbench (show other bugs)
Version: 1.4   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: 1.4 M7   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-04-04 12:05 EDT by Andreas Hoegger CLA
Modified: 2011-04-05 08:50 EDT (History)
1 user (show)

See Also:


Attachments
Proposed patch (1.28 KB, patch)
2011-04-05 07:52 EDT, Ivan Furnadjiev CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Andreas Hoegger CLA 2011-04-04 12:05:08 EDT
By creating a shell only app using jobs I run into a NPE. 
The display on the workbench is null and the 'PlatformUI.getWorkbench().getDisplay()' lookup is done in the ProgessInforItem.

/andy

Stacktrace:
-----------
java.lang.NullPointerException
	at org.eclipse.ui.internal.progress.ProgressInfoItem.init(ProgressInfoItem.java:183)
	at org.eclipse.ui.internal.progress.ProgressManager$ProgressManagerProvider.getInstance(ProgressManager.java:106)
	at org.eclipse.ui.internal.progress.ProgressManager.getInstance(ProgressManager.java:188)
	at org.eclipse.rap.ui.internal.progress.JobManagerAdapter$4.run(JobManagerAdapter.java:195)
	at org.eclipse.rwt.internal.lifecycle.FakeContextUtil.runNonUIThreadWithFakeContext(FakeContextUtil.java:60)
	at org.eclipse.rwt.lifecycle.UICallBack.runNonUIThreadWithFakeContext(UICallBack.java:48)
	at org.eclipse.rap.ui.internal.progress.JobManagerAdapter.findSessionProgressManager(JobManagerAdapter.java:193)
	at org.eclipse.rap.ui.internal.progress.JobManagerAdapter.findProgressManager(JobManagerAdapter.java:180)
	at org.eclipse.rap.ui.internal.progress.JobManagerAdapter.scheduled(JobManagerAdapter.java:165)
	at org.eclipse.core.internal.jobs.JobListeners$5.notify(JobListeners.java:49)
	at org.eclipse.core.internal.jobs.JobListeners.doNotify(JobListeners.java:96)
	at org.eclipse.core.internal.jobs.JobListeners.scheduled(JobListeners.java:162)
	at org.eclipse.core.internal.jobs.JobManager.schedule(JobManager.java:1123)
	at org.eclipse.core.internal.jobs.InternalJob.schedule(InternalJob.java:427)
	at org.eclipse.core.runtime.jobs.Job.schedule(Job.java:436)
	at sampleapp.EntryPoint.executeJob(EntryPoint.java:58)
	at sampleapp.EntryPoint.access$0(EntryPoint.java:46)
	at sampleapp.EntryPoint$1.widgetSelected(EntryPoint.java:32)
	at org.eclipse.swt.events.SelectionEvent.dispatchToObserver(SelectionEvent.java:196)
	at org.eclipse.rwt.internal.events.Event.processEvent(Event.java:44)
	at org.eclipse.swt.events.TypedEvent.processEvent(TypedEvent.java:163)
	at org.eclipse.swt.events.TypedEvent.executeNext(TypedEvent.java:203)
	at org.eclipse.swt.widgets.Display.runPendingMessages(Display.java:1143)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1133)
	at sampleapp.EntryPoint.createUI(EntryPoint.java:39)
	at org.eclipse.rwt.internal.lifecycle.EntryPointManagerInstance.createUI(EntryPointManagerInstance.java:79)
	at org.eclipse.rwt.internal.lifecycle.EntryPointManager.createUI(EntryPointManager.java:33)
	at org.eclipse.rwt.internal.lifecycle.RWTLifeCycle.createUI(RWTLifeCycle.java:242)
	at org.eclipse.rwt.internal.lifecycle.RWTLifeCycle$UIThreadController.run(RWTLifeCycle.java:111)
	at java.lang.Thread.run(Thread.java:619)
	at org.eclipse.rwt.internal.lifecycle.UIThread.run(UIThread.java:102)
Comment 1 Ivan Furnadjiev CLA 2011-04-04 12:16:42 EDT
Andreas, could you provide a self-running snippet to reproduce it?
Comment 2 Andreas Hoegger CLA 2011-04-04 12:45:54 EDT
Sure:
user the following code as your IEntryPoint.createUI() content.

Display display = new Display();
		Shell shell = new Shell(display, SWT.NO_TRIM);
		shell.setLayout(new GridLayout(1, false));

		Button button = new Button(shell, SWT.PUSH);
		button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false,
				false));
		button.setText("Test button");
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				new Job(""){
					@Override
					protected IStatus run(IProgressMonitor monitor) {
						try {
							Thread.sleep(2000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						return Status.OK_STATUS;
					}
				}.schedule();
			}
		});

		shell.setMaximized(true);
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
		return 0;
Comment 3 Ivan Furnadjiev CLA 2011-04-05 03:53:13 EDT
Thanks for the snippet... I can reproduce it now
Comment 4 Ivan Furnadjiev CLA 2011-04-05 07:52:22 EDT
Created attachment 192545 [details]
Proposed patch

The JobManagerAdapter (initialized in WorkbenchPlugin#start ) connects the Job APIs with ProgressManager regardless the Workbench is created or not ( Workbench display is set in Workbench#createAndRunWorkbench() ). Thus, the display used by ProgressInfoItem#init ( PlatformUI.getWorkbench().getDisplay() ) is null. As this display is only used for getting the system color, I think it's safe to replace the PlatformUI.getWorkbench().getDisplay() with Display#getCurrent().
Comment 5 Andreas Hoegger CLA 2011-04-05 08:21:54 EDT
+1
works for me.
Comment 6 Ivan Furnadjiev CLA 2011-04-05 08:50:53 EDT
Applied patch to CVS HEAD.