Bug 427061 - OOME in Plug-in Image Browser

Change-Id: I444ca7dd69863b6a213e6a9dc9e7a9031eaa3e13
Signed-off-by: Vikas Chandra <Vikas.Chandra@in.ibm.com>
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/ImageBrowserView.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/ImageBrowserView.java
index 74e0af5..cb06c71 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/ImageBrowserView.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/ImageBrowserView.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- *  Copyright (c) 2012, 2013 Christian Pontesegger and others.
+ *  Copyright (c) 2012, 2014 Christian Pontesegger and others.
  *  All rights reserved. This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
@@ -58,6 +58,8 @@
 
 	private List<Image> displayedImages = new ArrayList<Image>();
 
+	private AbstractRepository repository;
+
 	public ImageBrowserView() {
 		// create default filters
 		final IFilter iconSize = new SizeFilter(16, SizeFilter.TYPE_EXACT, 16, SizeFilter.TYPE_EXACT);
@@ -240,6 +242,9 @@
 	}
 
 	private void scanImages() {
+		if (repository != null) {
+			repository.cancel();
+		}
 		nextButton.setEnabled(false);
 
 		// reset UI components
@@ -263,7 +268,7 @@
 			// set maximum image counter
 			mImageCounter = spinMaxImages.getSelection();
 
-			final AbstractRepository repository = (AbstractRepository) ((IStructuredSelection) sourceCombo.getSelection()).getFirstElement();
+			repository = (AbstractRepository) ((IStructuredSelection) sourceCombo.getSelection()).getFirstElement();
 			repository.schedule();
 		}
 	}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/AbstractRepository.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/AbstractRepository.java
index 9d9e62c..5773a6b 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/AbstractRepository.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/AbstractRepository.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- *  Copyright (c) 2012, 2013 Christian Pontesegger and others.
+ *  Copyright (c) 2012, 2014 Christian Pontesegger and others.
  *  All rights reserved. This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
@@ -27,7 +27,7 @@
 
 public abstract class AbstractRepository extends Job {
 
-	private List<ImageElement> mElementsCache = new LinkedList<ImageElement>();
+	protected List<ImageElement> mElementsCache = new LinkedList<ImageElement>();
 
 	private IImageTarget mTarget;
 
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/TargetPlatformRepository.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/TargetPlatformRepository.java
index bfaacb8..7e9c054 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/TargetPlatformRepository.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/TargetPlatformRepository.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- *  Copyright (c) 2012, 2013 Christian Pontesegger and others.
+ *  Copyright (c) 2012, 2014 Christian Pontesegger and others.
  *  All rights reserved. This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
@@ -14,8 +14,7 @@
 import java.io.File;
 import java.net.URI;
 import java.util.*;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.*;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.pde.core.target.*;
 import org.eclipse.pde.internal.ui.PDEPlugin;
@@ -100,6 +99,19 @@
 		}
 	}
 
+	@Override
+	protected synchronized IStatus run(IProgressMonitor monitor) {
+		super.run(monitor);
+		if (fBundles != null) {
+			fBundles.clear();
+			fBundles = null;
+		}
+		if (mElementsCache != null)
+			mElementsCache.clear();
+		return Status.OK_STATUS;
+	}
+
+	@Override
 	public String toString() {
 		if (!fUseCurrent) {
 			return PDEUIMessages.TargetPlatformRepository_RunningPlatform;
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/WorkspaceRepository.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/WorkspaceRepository.java
index 44dd34c..0d6593d 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/WorkspaceRepository.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/views/imagebrowser/repositories/WorkspaceRepository.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- *  Copyright (c) 2012, 2013 Christian Pontesegger and others.
+ *  Copyright (c) 2012, 2014 Christian Pontesegger and others.
  *  All rights reserved. This program and the accompanying materials
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
@@ -96,6 +96,19 @@
 			fProjects = Collections.emptyList();
 	}
 
+	@Override
+	protected synchronized IStatus run(IProgressMonitor monitor) {
+		super.run(monitor);
+		if (fProjects != null) {
+			fProjects.clear();
+			fProjects = null;
+		}
+		if (mElementsCache != null)
+			mElementsCache.clear();
+		return Status.OK_STATUS;
+	}
+
+
 	public String toString() {
 		return "Workspace"; //$NON-NLS-1$
 	}