Bug 576736 - try to restart analysis on "resource not found" errors

Change-Id: I233eca934a97ea9d956b676ee1462da67b44bf5c
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/pde/eclipse.pde.ui/+/189551
Tested-by: PDE Bot <pde-bot@eclipse.org>
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java
index 0208a70..2084f4b 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ApiAnalysisBuilder.java
@@ -34,6 +34,7 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceStatus;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.IncrementalProjectBuilder;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -577,11 +578,40 @@
 			try {
 				work(fullBuild, wbaseline, projects, monitor);
 			} catch (CoreException e) {
-				return e.getStatus();
+				IStatus status = e.getStatus();
+				if (monitor.isCanceled()) {
+					return Status.CANCEL_STATUS;
+				} else {
+					if (status.getCode() == IResourceStatus.RESOURCE_NOT_FOUND && project.isAccessible()) {
+						waitForLockAndReschedule(monitor, e);
+						return Status.OK_STATUS;
+					} else {
+						return status;
+					}
+				}
 			}
 			return Status.OK_STATUS;
 		}
 
+		/**
+		 * In case the analysis job was interrupted by the build, let wait for the build
+		 * and start analysis again
+		 */
+		private void waitForLockAndReschedule(IProgressMonitor monitor, CoreException e) {
+			try {
+				Job.getJobManager().beginRule(project, monitor);
+				IStatus s = new Status(IStatus.INFO, ApiAnalysisBuilder.class,
+						"Re-scheduling API analysis for " + project.getName(), e); //$NON-NLS-1$
+				ApiPlugin.log(s);
+				schedule();
+			} catch (OperationCanceledException e1) {
+				// nothing to do
+			} finally {
+				// release lock, we don't want to block workspace while analysis
+				Job.getJobManager().endRule(project);
+			}
+		}
+
 		@Override
 		public boolean belongsTo(Object family) {
 			return super.belongsTo(family) || ApiAnalysisJob.class == family;