Adapt JobManagerAdapter to recent platform changes
Don't cancel finished jobs in "done" listener. Canceled jobs can't be
re-scheduled anymore.
Fix NPE when UI job is scheduled/finished after UI session is
terminated.
Bug 559612: Job rescheduling doesn't work any more
https://bugs.eclipse.org/bugs/show_bug.cgi?id=559612
Change-Id: Ic862f563ffecf97a01e9245da0081a5629ba2ef7
diff --git a/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/rap/ui/internal/progress/JobManagerAdapter.java b/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/rap/ui/internal/progress/JobManagerAdapter.java
index 5b12bd6..fd32753 100644
--- a/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/rap/ui/internal/progress/JobManagerAdapter.java
+++ b/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/rap/ui/internal/progress/JobManagerAdapter.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2012 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2007, 2020 Innoopract Informationssysteme GmbH and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -103,16 +103,19 @@
///////////////////////////////
// interface IJobChangeListener
+ @Override
public void aboutToRun( final IJobChangeEvent event ) {
ProgressManager manager = findProgressManager( event.getJob() );
manager.changeListener.aboutToRun( event );
}
+ @Override
public void awake( final IJobChangeEvent event ) {
ProgressManager manager = findProgressManager( event.getJob() );
manager.changeListener.awake( event );
}
+ @Override
public void done( final IJobChangeEvent event ) {
final ProgressManager[] manager = new ProgressManager[ 1 ];
Display display = null;
@@ -126,6 +129,7 @@
}
if( display != null && !display.isDisposed() ) {
display.asyncExec( new Runnable() {
+ @Override
public void run() {
ServerPushManager.getInstance().deactivateServerPushFor( event.getJob() );
manager[ 0 ].changeListener.done( event );
@@ -133,24 +137,26 @@
} );
} else {
// RAP [rh] fixes bug 283595
- event.getJob().cancel();
manager[ 0 ].changeListener.done( event );
}
}
+ @Override
public void running( final IJobChangeEvent event ) {
ProgressManager manager = findProgressManager( event.getJob() );
manager.changeListener.running( event );
}
+ @Override
public void scheduled( final IJobChangeEvent event ) {
ProgressManager manager;
Display display = findDisplay( event.getJob() );
synchronized( lock ) {
- if( display != null ) {
+ if( display != null && !display.isDisposed() ) {
jobs.put( event.getJob(), display );
Runnable runnable = new Runnable() {
+ @Override
public void run() {
bindToSession( event.getJob() );
ServerPushManager.getInstance().activateServerPushFor( event.getJob() );
@@ -163,6 +169,7 @@
manager.changeListener.scheduled( event );
}
+ @Override
public void sleeping( final IJobChangeEvent event ) {
ProgressManager manager = findProgressManager( event.getJob() );
manager.changeListener.sleeping( event );
@@ -185,6 +192,7 @@
Display display = ( Display )jobs.get( job );
if( display != null ) {
RWT.getUISession( display ).exec( new Runnable() {
+ @Override
public void run() {
result[ 0 ] = ProgressManager.getInstance();
}
@@ -224,6 +232,7 @@
final UISession uiSession = RWT.getUISession();
final UISessionListener cleanupListener = new UISessionListener() {
+ @Override
public void beforeDestroy( UISessionEvent event ) {
if( !jobDone.get() ) {
try {
@@ -247,6 +256,7 @@
Display display = ( Display )jobs.get( jobToRemove );
if( display != null ) {
RWT.getUISession( display ).exec( new Runnable() {
+ @Override
public void run() {
jobToRemove.cancel();
jobToRemove.addJobChangeListener( new JobCanceler() );
@@ -266,7 +276,7 @@
Object[] runningJobs = set.toArray();
for( int i = 0; i < runningJobs.length; i++ ) {
Job toCheck = ( Job )runningJobs[ i ];
- IJobMarker marker = ( IJobMarker )toCheck.getAdapter( IJobMarker.class );
+ IJobMarker marker = toCheck.getAdapter( IJobMarker.class );
if( marker != null && marker.canBeRemoved() ) {
set.remove( toCheck );
}
diff --git a/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java b/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java
index 6d77328..3168461 100644
--- a/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java
+++ b/bundles/org.eclipse.rap.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2003, 2018 IBM Corporation and others.
+ * Copyright (c) 2003, 2020 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -267,11 +267,13 @@
public void done() {
final JobInfo info = getJobInfo(job);
// RAP [if]: ensure mapping to context
- RWT.getUISession( display ).exec( new Runnable() {
- public void run() {
- info.clearTaskInfo();
- }
- } );
+ if (!display.isDisposed()) {
+ RWT.getUISession( display ).exec( new Runnable() {
+ public void run() {
+ info.clearTaskInfo();
+ }
+ } );
+ }
info.clearChildren();
runnableMonitors.remove(job);
if (listener != null) {