Bug 578257 - API job should cancel execution on disposed baseline, take
2

Added monitor to considerReference() too.

Change-Id: Ieb6d1843cea39615d1c364b46cc6168ee5d2b909
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/pde/eclipse.pde.ui/+/189798
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/AbstractIllegalMethodReference.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractIllegalMethodReference.java
index 555199d..e0fd224 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractIllegalMethodReference.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractIllegalMethodReference.java
@@ -59,9 +59,9 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
 		MethodKey key = new MethodKey(reference.getReferencedTypeName(), reference.getReferencedMemberName(), reference.getReferencedSignature(), true);
-		if (super.considerReference(reference) && fIllegalMethods.containsKey(key)) {
+		if (super.considerReference(reference, monitor) && fIllegalMethods.containsKey(key)) {
 			retainReference(reference);
 			return true;
 		}
@@ -77,7 +77,7 @@
 				if (member instanceof IApiMethod) {
 					IApiMethod method = (IApiMethod) member;
 					if (method.isDefaultMethod()) {
-						return considerReference(reference);
+						return considerReference(reference, monitor);
 					}
 				}
 			}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractIllegalTypeReference.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractIllegalTypeReference.java
index 511017a..499c084 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractIllegalTypeReference.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractIllegalTypeReference.java
@@ -62,8 +62,8 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
-		if (super.considerReference(reference) && fIllegalTypes.containsKey(reference.getReferencedTypeName())) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
+		if (super.considerReference(reference, monitor) && fIllegalTypes.containsKey(reference.getReferencedTypeName())) {
 			retainReference(reference);
 			return true;
 		}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractProblemDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractProblemDetector.java
index 077aedb..9523c6d 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractProblemDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractProblemDetector.java
@@ -160,7 +160,7 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
 		return reference != null && (reference.getReferenceKind() & getReferenceKinds()) > 0;
 	}
 
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractTypeLeakDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractTypeLeakDetector.java
index 255433f..1bf3a20 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractTypeLeakDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/AbstractTypeLeakDetector.java
@@ -48,11 +48,11 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
 		// consider the reference if the location the reference is made from is
 		// visible:
 		// i.e. a public or protected class in an API package
-		if (super.considerReference(reference) && isNonAPIReference(reference)) {
+		if (super.considerReference(reference, monitor) && isNonAPIReference(reference)) {
 			IApiMember member = reference.getMember();
 			int modifiers = member.getModifiers();
 			if (((Flags.AccPublic | Flags.AccProtected) & modifiers) > 0) {
@@ -68,6 +68,7 @@
 					}
 				} catch (CoreException e) {
 					ApiPlugin.log(e.getStatus());
+					checkIfDisposed(reference.getMember().getApiComponent(), monitor);
 				}
 			}
 		}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java
index f9cc96b..9c060df 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalAnnotationReferenceDetector.java
@@ -14,6 +14,7 @@
 package org.eclipse.pde.api.tools.internal.builder;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IAnnotatable;
 import org.eclipse.jdt.core.IAnnotation;
 import org.eclipse.jdt.core.ISourceRange;
@@ -59,8 +60,8 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
-		return super.considerReference(reference);
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
+		return super.considerReference(reference, monitor);
 	}
 
 	@Override
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalFieldReferenceDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalFieldReferenceDetector.java
index 8279f46..0868fa9 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalFieldReferenceDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalFieldReferenceDetector.java
@@ -78,9 +78,9 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
 		MethodKey key = new MethodKey(reference.getReferencedTypeName(), reference.getReferencedMemberName(), reference.getReferencedSignature(), true);
-		if ((super.considerReference(reference) && fIllegalFields.containsKey(key)) || isEnclosedBy(reference.getReferencedTypeName(), fIllegalTypes.keySet())) {
+		if ((super.considerReference(reference, monitor) && fIllegalFields.containsKey(key)) || isEnclosedBy(reference.getReferencedTypeName(), fIllegalTypes.keySet())) {
 			retainReference(reference);
 			return true;
 		}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalImplementsProblemDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalImplementsProblemDetector.java
index 006b04b..1edde8c 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalImplementsProblemDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalImplementsProblemDetector.java
@@ -58,9 +58,9 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
 		try {
-			if (super.considerReference(reference)) {
+			if (super.considerReference(reference, monitor)) {
 				return true;
 			}
 			IApiType type = (IApiType) reference.getMember();
@@ -80,6 +80,7 @@
 			if (ApiPlugin.DEBUG_PROBLEM_DETECTOR) {
 				ApiPlugin.log(ce);
 			}
+			checkIfDisposed(reference.getMember().getApiComponent(), monitor);
 		}
 		return false;
 	}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalMethodReferenceDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalMethodReferenceDetector.java
index 9747421..d120b09 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalMethodReferenceDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/IllegalMethodReferenceDetector.java
@@ -52,8 +52,8 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
-		if (super.considerReference(reference)) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
+		if (super.considerReference(reference, monitor)) {
 			return true;
 		}
 		if (isEnclosedBy(reference.getReferencedTypeName(), fIllegalTypes.keySet())) {
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/MethodLeakDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/MethodLeakDetector.java
index ae90789..43e5ad6 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/MethodLeakDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/MethodLeakDetector.java
@@ -139,8 +139,8 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
-		if (super.considerReference(reference) && isNonAPIReference(reference)) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
+		if (super.considerReference(reference, monitor) && isNonAPIReference(reference)) {
 			IApiMember member = reference.getMember();
 			if (member != null && matchesSourceModifiers(member) && matchesSourceApiRestrictions(member)) {
 				retainReference(reference);
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceAnalyzer.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceAnalyzer.java
index 6053d3f..7db08bf 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceAnalyzer.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceAnalyzer.java
@@ -97,13 +97,19 @@
 					List<IReference> references = type.extractReferences(fAllReferenceKinds, null);
 					// keep potential matches
 					for (IReference ref : references) {
+						if (fMonitor.isCanceled()) {
+							break;
+						}
 						// compute index of interested problem detectors
 						int index = getLog2(ref.getReferenceKind());
 						IApiProblemDetector[] detectors = fIndexedDetectors[index];
 						boolean added = false;
 						if (detectors != null) {
 							for (IApiProblemDetector detector : detectors) {
-								if (detector.considerReference(ref)) {
+								if (fMonitor.isCanceled()) {
+									break;
+								}
+								if (detector.considerReference(ref, fMonitor)) {
 									if (!added) {
 										fReferences.add(ref);
 										added = true;
@@ -114,6 +120,7 @@
 					}
 				} catch (CoreException e) {
 					fStatus.add(e.getStatus());
+					AbstractProblemDetector.checkIfDisposed(classFile.getApiComponent(), fMonitor);
 				}
 			}
 		}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/SystemApiDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/SystemApiDetector.java
index b305f8e..c783a43 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/SystemApiDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/SystemApiDetector.java
@@ -367,7 +367,7 @@
 	}
 
 	@Override
-	public boolean considerReference(IReference reference) {
+	public boolean considerReference(IReference reference, IProgressMonitor monitor) {
 		try {
 			IApiComponent apiComponent = reference.getMember().getApiComponent();
 			IApiBaseline baseline = apiComponent.getBaseline();
@@ -394,6 +394,7 @@
 			}
 		} catch (CoreException e) {
 			ApiPlugin.log(e);
+			checkIfDisposed(reference.getMember().getApiComponent(), monitor);
 		}
 		return false;
 	}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/builder/IApiProblemDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/builder/IApiProblemDetector.java
index 62f0da8..d9a69e0 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/builder/IApiProblemDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/builder/IApiProblemDetector.java
@@ -38,9 +38,10 @@
 	 * for further analysis once references have been resolved.
 	 *
 	 * @param reference potential problem
+	 * @param monitor the monitor to report progress.
 	 * @return whether the unresolved reference is a potential problem
 	 */
-	public boolean considerReference(IReference reference);
+	public boolean considerReference(IReference reference, IProgressMonitor monitor);
 
 	/**
 	 * Returns a list of any problems detected after analyzing potential
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java
index a88d015..e92148f 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java
@@ -21,6 +21,7 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.SubMonitor;
 import org.eclipse.jdt.core.Flags;
+import org.eclipse.pde.api.tools.internal.builder.AbstractProblemDetector;
 import org.eclipse.pde.api.tools.internal.comparator.ClassFileComparator;
 import org.eclipse.pde.api.tools.internal.comparator.Delta;
 import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
@@ -786,11 +787,13 @@
 								}
 							} catch (CoreException e) {
 								ApiPlugin.log(e);
+								AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), iterationMonitor);
 							}
 						}
 					});
 				} catch (CoreException e) {
 					ApiPlugin.log(e);
+					AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), loopMonitor);
 				}
 			}
 		}
@@ -908,11 +911,13 @@
 											}
 										} catch (CoreException e) {
 											ApiPlugin.log(e);
+											AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), apiContainerIterationMonitor);
 										}
 									}
 								});
 							} catch (CoreException e) {
 								ApiPlugin.log(e);
+								AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), apiContainerIterationMonitor);
 							}
 						}
 					}
@@ -952,11 +957,13 @@
 										Util.getComponentVersionsId(component2) }));
 							} catch (CoreException e) {
 								ApiPlugin.log(e);
+								AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), iterationMonitor);
 							}
 						}
 					});
 				} catch (CoreException e) {
 					ApiPlugin.log(e);
+					AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), iterationMonitor);
 				}
 			}
 		}
@@ -1008,11 +1015,13 @@
 													Util.getComponentVersionsId(component) }));
 										} catch (CoreException e) {
 											ApiPlugin.log(e);
+											AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), typeContainerIterationMonitor);
 										}
 									}
 								});
 							} catch (CoreException e) {
 								ApiPlugin.log(e);
+								AbstractProblemDetector.checkIfDisposed(container.getApiComponent(), typeContainerIterationMonitor);
 							}
 						}
 					}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/CompareApiScopeVisitor.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/CompareApiScopeVisitor.java
index 0610a2a..348d3e9 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/CompareApiScopeVisitor.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/CompareApiScopeVisitor.java
@@ -17,6 +17,7 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.pde.api.tools.internal.builder.AbstractProblemDetector;
 import org.eclipse.pde.api.tools.internal.comparator.Delta;
 import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin;
 import org.eclipse.pde.api.tools.internal.provisional.model.ApiScopeVisitor;
@@ -79,6 +80,7 @@
 					compareApiTypeRoot(typeroot);
 				} catch (CoreException e) {
 					ApiPlugin.log(e);
+					AbstractProblemDetector.checkIfDisposed(typeroot.getApiComponent(), localMonitor);
 				}
 			}
 		});
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/search/UseSearchRequestor.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/search/UseSearchRequestor.java
index 0dc3de7..3a631f5 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/search/UseSearchRequestor.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/search/UseSearchRequestor.java
@@ -246,7 +246,7 @@
 			if (monitor.isCanceled()) {
 				break;
 			}
-			if (detector.considerReference(reference)) {
+			if (detector.considerReference(reference, monitor)) {
 				Reference ref = (Reference) reference;
 				ref.setFlags(IReference.F_ILLEGAL);
 				try {