Bug 361360 - CME in PageSite.activate
switched to a copy of the array before iterating
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/NestableHandlerService.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/NestableHandlerService.java
index 4576a75..7558f52 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/NestableHandlerService.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/handlers/NestableHandlerService.java
@@ -11,8 +11,6 @@
 
 package org.eclipse.ui.internal.handlers;
 
-import java.util.Iterator;
-
 import org.eclipse.core.expressions.Expression;
 import org.eclipse.ui.handlers.IHandlerActivation;
 import org.eclipse.ui.handlers.IHandlerService;
@@ -61,16 +59,17 @@
 			return;
 		}
 
-		final Iterator localActivationItr = localActivationsToParentActivations
-				.keySet().iterator();
-		while (localActivationItr.hasNext()) {
-			final Object object = localActivationItr.next();
+		Object[] localActivations = localActivationsToParentActivations.keySet().toArray();
+		for (int i = 0; i < localActivations.length; i++) {
+			final Object object = localActivations[i];
 			if (object instanceof IHandlerActivation) {
 				final IHandlerActivation localActivation = (IHandlerActivation) object;
-				super.doActivation(localActivation);
+				// Ignore activations that have been cleared since the copy
+				// was made.
+				if (localActivationsToParentActivations.containsKey(localActivation))
+					super.doActivation(localActivation);
 			}
 		}
-
 		active = true;
 	}
 
@@ -91,11 +90,11 @@
 		deactivateHandlers(parentActivations);
 		parentActivations.clear();
 
-		final Iterator localActivationItr = localActivationsToParentActivations
-				.keySet().iterator();
-		while (localActivationItr.hasNext()) {
-			final Object object = localActivationItr.next();
-			localActivationsToParentActivations.put(object, null);
+		Object[] localActivations = localActivationsToParentActivations.keySet().toArray();
+		for (int i = 0; i < localActivations.length; i++) {
+			final Object object = localActivations[i];
+			if (localActivationsToParentActivations.containsKey(object))
+				localActivationsToParentActivations.put(object, null);
 		}
 
 		active = false;