Bug 574584 - Various AutomaticUpdateScheduler issues after changing init
to Job

- prevent NPE if early startup job was not executed yet
- give 3rd party a chance to get the job execution status / join on it

Change-Id: I39e62dfc3fee73c86335072b2607898808449570
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/equinox/rt.equinox.p2/+/182669
Tested-by: Equinox Bot <equinox-bot@eclipse.org>
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF
index 1327943..93ad224 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %bundleName
 Bundle-SymbolicName: org.eclipse.equinox.p2.ui.sdk.scheduler;singleton:=true
-Bundle-Version: 1.5.100.qualifier
+Bundle-Version: 1.5.200.qualifier
 Bundle-Activator: org.eclipse.equinox.internal.p2.ui.sdk.scheduler.AutomaticUpdatePlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml
index df96871..0490e86 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml
@@ -9,6 +9,6 @@
   </parent>
   <groupId>org.eclipse.equinox</groupId>
   <artifactId>org.eclipse.equinox.p2.ui.sdk.scheduler</artifactId>
-  <version>1.5.100-SNAPSHOT</version>
+  <version>1.5.200-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
index 19833a9..5042025 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
@@ -19,8 +19,7 @@
 
 import java.util.Date;
 import java.util.Random;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
 import org.eclipse.equinox.internal.p2.garbagecollector.GarbageCollector;
@@ -52,8 +51,8 @@
 	private static final int ONE_HOUR_IN_MS = 60 * 60 * 1000;
 	private static final int ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;
 
-	private IUpdateListener listener = null;
-	private IUpdateChecker checker = null;
+	private IUpdateListener listener;
+	private IUpdateChecker checker;
 
 	private IProvisioningAgent agent;
 
@@ -61,21 +60,32 @@
 	public void earlyStartup() {
 		AutomaticUpdatePlugin.getDefault().setScheduler(this);
 
-		Job updateJob = Job.create("Update Job", e -> { //$NON-NLS-1$
-			agent = ServiceHelper.getService(AutomaticUpdatePlugin.getContext(), IProvisioningAgent.class);
-			IProfileRegistry registry = agent.getService(IProfileRegistry.class);
-			IProfile currentProfile = registry.getProfile(IProfileRegistry.SELF);
-			if (currentProfile != null && new MigrationSupport().performMigration(agent, registry, currentProfile)) {
-				return;
+		Job updateJob = new Job("Update Job") { //$NON-NLS-1$
+
+			@Override
+			protected IStatus run(IProgressMonitor monitor) {
+				agent = ServiceHelper.getService(AutomaticUpdatePlugin.getContext(), IProvisioningAgent.class);
+				IProfileRegistry registry = agent.getService(IProfileRegistry.class);
+				IProfile currentProfile = registry.getProfile(IProfileRegistry.SELF);
+				if (currentProfile != null
+						&& new MigrationSupport().performMigration(agent, registry, currentProfile)) {
+					return Status.OK_STATUS;
+				}
+
+				removeUnusedPlugins(registry);
+				scheduleUpdate();
+				return Status.OK_STATUS;
 			}
 
-			removeUnusedPlugins(registry);
-			scheduleUpdate();
-		});
+			@Override
+			public boolean belongsTo(Object family) {
+				return AutomaticUpdateScheduler.class == family;
+			}
+		};
+
 		updateJob.setSystem(true);
 		// allow the system to settle
 		updateJob.schedule(20000);
-
 	}
 
 	/**
@@ -139,7 +149,12 @@
 			}
 		};
 
-		checker = agent.getService(IUpdateChecker.class);
+		IProvisioningAgent pagent = agent;
+		if (pagent == null) {
+			// Job not executed yet
+			pagent = ServiceHelper.getService(AutomaticUpdatePlugin.getContext(), IProvisioningAgent.class);
+		}
+		checker = pagent.getService(IUpdateChecker.class);
 		if (checker == null) {
 			// Something did not initialize properly
 			IStatus status = new Status(IStatus.ERROR, AutomaticUpdatePlugin.PLUGIN_ID,