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) {