ASSIGNED - bug 302190: when checking out a project from SCM, don't add every single file to the context
https://bugs.eclipse.org/bugs/show_bug.cgi?id=302190
diff --git a/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
index 7a29c44..a4f9269 100644
--- a/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.mylyn.java.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Mylyn Java Tests
 Bundle-SymbolicName: org.eclipse.mylyn.java.tests;singleton:=true
-Bundle-Version: 3.4.0.qualifier
+Bundle-Version: 3.4.1.qualifier
 Bundle-Vendor: Eclipse Mylyn
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.jdt.core,
diff --git a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
index 30c5eec..79d64de 100644
--- a/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
+++ b/org.eclipse.mylyn.resources.tests/src/org/eclipse/mylyn/resources/tests/ResourceChangeMonitorTest.java
@@ -11,7 +11,9 @@
 
 package org.eclipse.mylyn.resources.tests;
 
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.eclipse.core.internal.events.ResourceChangeEvent;
@@ -137,6 +139,110 @@
 		assertTrue(element.getInterest().isPropagated());
 	}
 
+	public void testLargeFileChangeNotAddedToContext() throws CoreException {
+
+		List<String> filePaths = new ArrayList<String>();
+		filePaths.add("/" + file.getProjectRelativePath().toPortableString());
+		for (int i = 0; i < 10; i++) {
+			IFile newFile = project.getProject().getFile("test" + i + ".txt");
+			newFile.create(null, true, null);
+			assertTrue(newFile.exists());
+			filePaths.add("/" + newFile.getProjectRelativePath().toPortableString());
+		}
+
+		MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+				filePaths.toArray(new String[filePaths.size()]), (IResourceDelta.CHANGED | IResourceDelta.CONTENT),
+				IResource.PROJECT);
+		IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+		changeMonitor.resourceChanged(event);
+		String handle = ContextCore.getStructureBridge(file).getHandleIdentifier(file);
+		assertNotNull(handle);
+		IInteractionElement element = context.get(handle);
+		assertNull(element);
+	}
+
+	public void testLargeFileAddedNotAddedToContext() throws CoreException {
+
+		List<String> filePaths = new ArrayList<String>();
+		filePaths.add("/" + file.getProjectRelativePath().toPortableString());
+		for (int i = 0; i < 10; i++) {
+			IFile newFile = project.getProject().getFile("test" + i + ".txt");
+			newFile.create(null, true, null);
+			assertTrue(newFile.exists());
+			filePaths.add("/" + newFile.getProjectRelativePath().toPortableString());
+		}
+
+		MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+				filePaths.toArray(new String[filePaths.size()]), (IResourceDelta.ADDED | IResourceDelta.CONTENT),
+				IResource.PROJECT);
+		IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+		changeMonitor.resourceChanged(event);
+		String handle = ContextCore.getStructureBridge(file).getHandleIdentifier(file);
+		assertNotNull(handle);
+		IInteractionElement element = context.get(handle);
+		assertNull(element);
+	}
+
+	public void testLargeFolderAddedNotAddedToContext() throws CoreException {
+
+		List<String> folderPaths = new ArrayList<String>();
+		folderPaths.add("/" + folder.getProjectRelativePath().toPortableString());
+		for (int i = 0; i < 3; i++) {
+			IFolder newFolder = project.getProject().getFolder("testFolder" + i);
+			newFolder.create(true, true, null);
+			assertTrue(newFolder.exists());
+			folderPaths.add("/" + newFolder.getProjectRelativePath().toPortableString());
+		}
+
+		MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+				folderPaths.toArray(new String[folderPaths.size()]), (IResourceDelta.ADDED | IResourceDelta.CONTENT),
+				IResource.PROJECT);
+		IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+		changeMonitor.resourceChanged(event);
+		String handle = ContextCore.getStructureBridge(folder).getHandleIdentifier(folder);
+		assertNotNull(handle);
+		IInteractionElement element = context.get(handle);
+		assertNull(element);
+	}
+
+	public void testLargeFolderChangeNotAddedToContext() throws CoreException {
+
+		List<String> folderPaths = new ArrayList<String>();
+		folderPaths.add("/" + folder.getProjectRelativePath().toPortableString());
+		for (int i = 0; i < 3; i++) {
+			IFolder newFolder = project.getProject().getFolder("testFolder" + i);
+			newFolder.create(true, true, null);
+			assertTrue(newFolder.exists());
+			folderPaths.add("/" + newFolder.getProjectRelativePath().toPortableString());
+		}
+
+		MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+				folderPaths.toArray(new String[folderPaths.size()]), (IResourceDelta.CHANGED | IResourceDelta.CONTENT),
+				IResource.PROJECT);
+		IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+		changeMonitor.resourceChanged(event);
+		String handle = ContextCore.getStructureBridge(folder).getHandleIdentifier(folder);
+		assertNotNull(handle);
+		IInteractionElement element = context.get(handle);
+		assertNull(element);
+	}
+
+	public void testFolderAdded() throws CoreException {
+
+		List<String> folderPaths = new ArrayList<String>();
+		folderPaths.add("/" + folder.getProjectRelativePath().toPortableString());
+
+		MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
+				folderPaths.toArray(new String[folderPaths.size()]), (IResourceDelta.ADDED | IResourceDelta.CONTENT),
+				IResource.PROJECT);
+		IResourceChangeEvent event = new ResourceChangeEvent(delta, IResourceChangeEvent.POST_CHANGE, 0, delta);
+		changeMonitor.resourceChanged(event);
+		String handle = ContextCore.getStructureBridge(folder).getHandleIdentifier(folder);
+		assertNotNull(handle);
+		IInteractionElement element = context.get(handle);
+		assertNull(element);
+	}
+
 	public void testModifiedFile() throws CoreException {
 		MockResourceDelta delta = MockResourceDelta.createMockDelta("/" + project.getProject().getName(),
 				new String[] { "/test.txt" }, (IResourceDelta.CHANGED | IResourceDelta.CONTENT), IResource.PROJECT);
diff --git a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
index d6a32b4..bde6235 100644
--- a/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
+++ b/org.eclipse.mylyn.resources.ui/src/org/eclipse/mylyn/internal/resources/ui/ResourceChangeMonitor.java
@@ -38,6 +38,10 @@
  */
 public class ResourceChangeMonitor implements IResourceChangeListener {
 
+	private static final int MAX_FILE_DELTA_SIZE = 10;
+
+	private static final int MAX_NEW_FOLDER_DELTA_SIZE = 3;
+
 	private class ResourceDeltaVisitor implements IResourceDeltaVisitor {
 
 		private final Set<IResource> addedResources;
@@ -48,6 +52,10 @@
 
 		private final List<IResourceExclusionStrategy> resourceExclusions;
 
+		private int numNonExcludedFiles = 0;
+
+		private int numAddedFolders = 0;
+
 		public ResourceDeltaVisitor(List<IResourceExclusionStrategy> resourceExclusions) {
 			this.resourceExclusions = resourceExclusions;
 			this.addedResources = new HashSet<IResource>();
@@ -89,6 +97,12 @@
 						return false;
 					}
 
+					if (resource instanceof IFile) {
+						numNonExcludedFiles++;
+					} else if (resource instanceof IFolder) {
+						numAddedFolders++;
+					}
+
 					addedResources.add(resource);
 				}
 			}
@@ -107,7 +121,9 @@
 					if (hasTeamPrivate(resource)) {
 						return false;
 					}
-
+					if (resource instanceof IFile) {
+						numNonExcludedFiles++;
+					}
 					changedResources.add(resource);
 				}
 			}
@@ -142,6 +158,14 @@
 			return addedResources;
 		}
 
+		public int getNumChangedAndAddedFiles() {
+			return numNonExcludedFiles;
+		}
+
+		public int getNumAddedFolders() {
+			return numAddedFolders;
+		}
+
 	};
 
 	private boolean enabled;
@@ -181,8 +205,13 @@
 			try {
 				rootDelta.accept(visitor, IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
 				if (visitor.hasValidResult()) {
-					ResourcesUi.addResourceToContext(visitor.getChangedResources(), InteractionEvent.Kind.PREDICTION);
-					ResourcesUi.addResourceToContext(visitor.getAddedResources(), InteractionEvent.Kind.PROPAGATION);
+					// discard large changes as to not pollute the task context
+					if (visitor.getNumChangedAndAddedFiles() <= MAX_FILE_DELTA_SIZE
+							&& visitor.getNumAddedFolders() <= MAX_NEW_FOLDER_DELTA_SIZE) {
+						ResourcesUi.addResourceToContext(visitor.getChangedResources(),
+								InteractionEvent.Kind.PREDICTION);
+						ResourcesUi.addResourceToContext(visitor.getAddedResources(), InteractionEvent.Kind.PROPAGATION);
+					}
 				}
 			} catch (CoreException e) {
 				StatusHandler.log(new Status(IStatus.ERROR, ResourcesUiBridgePlugin.ID_PLUGIN,
diff --git a/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF b/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
index 8f87be6..a5ccfdd 100644
--- a/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
+++ b/org.eclipse.mylyn.team.cvs/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.mylyn.team.cvs;singleton:=true
-Bundle-Version: 3.4.0.qualifier
+Bundle-Version: 3.4.1.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Require-Bundle: org.eclipse.team.core,
  org.eclipse.team.cvs.ui,
diff --git a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
index 5f27715..e521a2f 100644
--- a/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
+++ b/org.eclipse.mylyn.team.cvs/src/org/eclipse/mylyn/internal/team/ccvs/CvsContextChangeSet.java
@@ -15,7 +15,6 @@
 import java.util.Set;
 
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.Platform;
@@ -24,15 +23,10 @@
 import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
 import org.eclipse.mylyn.internal.team.ui.ContextChangeSet;
 import org.eclipse.mylyn.internal.team.ui.LinkedTaskInfo;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.resources.ui.ResourcesUi;
 import org.eclipse.mylyn.tasks.core.ITask;
 import org.eclipse.mylyn.team.ui.AbstractTaskReference;
 import org.eclipse.mylyn.team.ui.IContextChangeSet;
-import org.eclipse.team.core.TeamException;
 import org.eclipse.team.core.diff.IDiff;
-import org.eclipse.team.core.diff.provider.ThreeWayDiff;
-import org.eclipse.team.core.mapping.provider.ResourceDiff;
 import org.eclipse.team.internal.ccvs.core.mapping.CVSActiveChangeSet;
 import org.eclipse.team.internal.core.subscribers.ActiveChangeSetManager;
 import org.osgi.service.prefs.Preferences;
@@ -50,16 +44,11 @@
 
 	public static final String SOURCE_ID = "org.eclipse.mylyn.java.context.changeset.add"; //$NON-NLS-1$
 
-	private boolean suppressInterestContribution = false;
-
 	private final ITask task;
 
-	private final ActiveChangeSetManager manager;
-
 	public CvsContextChangeSet(ITask task, ActiveChangeSetManager manager) {
 		super(manager, task.getSummary());
 		this.task = task;
-		this.manager = manager;
 		updateLabel();
 	}
 
@@ -118,26 +107,6 @@
 	@Override
 	public void add(IDiff diff) {
 		super.add(diff);
-		IResource resource = getResourceFromDiff(diff);
-		if (!suppressInterestContribution && resource != null) {
-			Set<IResource> resources = new HashSet<IResource>();
-			resources.add(resource);
-			if (ResourcesUiBridgePlugin.getDefault() != null && manager.isDefault(this)) {
-				// only add to the context if it is the active change set (bug 289240)
-				ResourcesUi.addResourceToContext(resources, InteractionEvent.Kind.SELECTION);
-			}
-		}
-	}
-
-	private IResource getResourceFromDiff(IDiff diff) {
-		if (diff instanceof ResourceDiff) {
-			return ((ResourceDiff) diff).getResource();
-		} else if (diff instanceof ThreeWayDiff) {
-			ThreeWayDiff threeWayDiff = (ThreeWayDiff) diff;
-			return ResourcesPlugin.getWorkspace().getRoot().findMember(threeWayDiff.getPath());
-		} else {
-			return null;
-		}
 	}
 
 	@Override
@@ -151,15 +120,8 @@
 	}
 
 	public void restoreResources(IResource[] newResources) throws CoreException {
-		suppressInterestContribution = true;
-		try {
-			super.add(newResources);
-			setComment(getComment(false));
-		} catch (TeamException e) {
-			throw e;
-		} finally {
-			suppressInterestContribution = false;
-		}
+		super.add(newResources);
+		setComment(getComment(false));
 	}
 
 	@Override
diff --git a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
index e7b5799..c2ce85f 100644
--- a/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
+++ b/org.eclipse.mylyn.team.ui/src/org/eclipse/mylyn/internal/team/ui/ContextChangeSet.java
@@ -30,14 +30,11 @@
 import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
 import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
 import org.eclipse.mylyn.internal.team.ui.properties.TeamPropertiesLinkProvider;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.resources.ui.ResourcesUi;
 import org.eclipse.mylyn.tasks.core.ITask;
 import org.eclipse.mylyn.tasks.core.TaskRepository;
 import org.eclipse.mylyn.team.ui.AbstractTaskReference;
 import org.eclipse.mylyn.team.ui.IContextChangeSet;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.team.core.TeamException;
 import org.eclipse.team.core.diff.IDiff;
 import org.eclipse.team.core.diff.provider.ThreeWayDiff;
 import org.eclipse.team.core.mapping.provider.ResourceDiff;
@@ -56,8 +53,6 @@
 
 	public static final String SOURCE_ID = "org.eclipse.mylyn.java.context.changeset.add"; //$NON-NLS-1$
 
-	private boolean suppressInterestContribution = false;
-
 	private final ITask task;
 
 	public ContextChangeSet(ITask task, ActiveChangeSetManager manager) {
@@ -121,14 +116,6 @@
 	@Override
 	public void add(IDiff diff) {
 		super.add(diff);
-		IResource resource = getResourceFromDiff(diff);
-		if (!suppressInterestContribution && resource != null) {
-			Set<IResource> resources = new HashSet<IResource>();
-			resources.add(resource);
-			if (ResourcesUiBridgePlugin.getDefault() != null) {
-				ResourcesUi.addResourceToContext(resources, InteractionEvent.Kind.SELECTION);
-			}
-		}
 	}
 
 	private IResource getResourceFromDiff(IDiff diff) {
@@ -153,15 +140,8 @@
 	}
 
 	public void restoreResources(IResource[] newResources) throws CoreException {
-		suppressInterestContribution = true;
-		try {
-			super.add(newResources);
-			setComment(getComment(false));
-		} catch (TeamException e) {
-			throw e;
-		} finally {
-			suppressInterestContribution = false;
-		}
+		super.add(newResources);
+		setComment(getComment(false));
 	}
 
 	@Override