Bug 507844: [Unittest] UI testsuite references causes memory issues

  trying to clean up all unnecessary data after testsuite finished
  execution
diff --git a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java
index 309e744..a558679 100644
--- a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java
+++ b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java
@@ -56,7 +56,7 @@
 	@SuppressWarnings("rawtypes")
 	@Override
 	public Map getCurrentState() {
-		final Map<String, Object> result = new HashMap<String, Object>();
+		final Map<String, Object> result = new HashMap<>();
 
 		result.put(VARIABLE_TESTSUITE, fCurrentSuite);
 
@@ -64,7 +64,7 @@
 	}
 
 	public void setActiveSuite(final TestSuite suite) {
-		if ((suite != null) && (suite.equals(fCurrentSuite)))
+		if (fCurrentSuite.equals(suite))
 			// nothing changed
 			return;
 
@@ -75,7 +75,7 @@
 		if (fCurrentSuite instanceof TestSuite)
 			((TestSuite) fCurrentSuite).addTestListener(this);
 
-		fireSourceChanged(ISources.ACTIVE_PART, VARIABLE_TESTSUITE, suite);
+		fireSourceChanged(ISources.ACTIVE_PART, VARIABLE_TESTSUITE, fCurrentSuite);
 
 		final IEvaluationService evaluationService = (IEvaluationService) PlatformUI.getWorkbench().getService(IEvaluationService.class);
 		evaluationService.requestEvaluation(VARIABLE_TESTSUITE);
@@ -95,5 +95,4 @@
 			evaluationService.requestEvaluation(VARIABLE_TESTSUITE);
 		}
 	}
-
 }
diff --git a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java
index 54e34de..83d5d63 100644
--- a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java
+++ b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java
@@ -19,15 +19,17 @@
 
 	@Override
 	protected void populateElements(final Object inputElement) {
-		final TestSuite suite = (TestSuite) ((Object[]) inputElement)[0];
+		if (inputElement != null) {
+			final TestSuite suite = (TestSuite) ((Object[]) inputElement)[0];
 
-		for (final TestFile testfile : suite.getChildren()) {
-			final Object file = testfile.getFile();
-			if (file instanceof IFile)
-				registerElement(((IFile) file).getParent().getProjectRelativePath(), testfile);
+			for (final TestFile testfile : suite.getChildren()) {
+				final Object file = testfile.getFile();
+				if (file instanceof IFile)
+					registerElement(((IFile) file).getParent().getProjectRelativePath(), testfile);
+			}
+
+			registerNodeReplacement(ROOT, suite);
+			setShowRoot(true);
 		}
-
-		registerNodeReplacement(ROOT, suite);
-		setShowRoot(true);
 	}
 }
diff --git a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java
index 7c1455a..9093718 100644
--- a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java
+++ b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java
@@ -90,7 +90,7 @@
 	public static final String TEST_STATUS_PROPERTY = "test status";
 
 	private static class Statistics {
-		private final Map<Object, Integer> mCounters = new HashMap<Object, Integer>();
+		private final Map<Object, Integer> mCounters = new HashMap<>();
 
 		public synchronized void updateCounter(final Object identifier, final int value) {
 			if (mCounters.containsKey(identifier))
@@ -508,7 +508,7 @@
 
 	private class UpdateUI extends UIJob {
 
-		private final List<Object> fElements = new ArrayList<Object>();
+		private final List<Object> fElements = new ArrayList<>();
 
 		public UpdateUI() {
 			super("Update Script Unit View");
@@ -530,7 +530,7 @@
 			// create a local copy of elements so we can continue tests without waiting for the UI updater
 			ArrayList<Object> localElements;
 			synchronized (fElements) {
-				localElements = new ArrayList<Object>(fElements);
+				localElements = new ArrayList<>(fElements);
 				fElements.clear();
 			}
 
@@ -754,6 +754,9 @@
 				// save timing information
 				if (fRuntimeInformation != null)
 					fRuntimeInformation.save();
+
+				// clear data to minimize memory footprint in eclipse caches
+				currentSuite.reset();
 			}
 
 			fFileTreeViewer.setInput(new Object[] { suite });
@@ -795,6 +798,18 @@
 		if (fRuntimeInformation != null)
 			fRuntimeInformation.save();
 
+		// allow for garbage collection as eclipse does not clean up views correctly on clode
+		fRuntimeInformation = null;
+		final TestSuiteSource instance = TestSuiteSource.getActiveInstance();
+		if (instance != null)
+			instance.setActiveSuite(null);
+
+		fFileTreeViewer.setInput(new Object[0]);
+
+		// clear data to minimize memory footprint in eclipse caches
+		if (currentSuite != null)
+			currentSuite.reset();
+
 		super.dispose();
 	}
 
diff --git a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java
index ffdc934..33e8125 100644
--- a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java
+++ b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java
@@ -69,7 +69,7 @@
 
 	private final TestSuiteModel fTestModel;
 	private boolean fTerminated = false;
-	private final Map<String, TestFile> fTestFiles = new HashMap<String, TestFile>();
+	private final Map<String, TestFile> fTestFiles = new HashMap<>();
 
 	private int fCurrentTestCount;
 	private List<TestFile> fActiveTestFiles = Collections.emptyList();
@@ -129,10 +129,10 @@
 
 				// setup done; extract variables
 				fSetupVariables = getScriptEngine().getVariables();
-				final ArrayList<TestFile> launchedTestFiles = new ArrayList<TestFile>();
+				final ArrayList<TestFile> launchedTestFiles = new ArrayList<>();
 
 				// main test execution loop
-				final List<TestFile> filesUnderTest = new ArrayList<TestFile>(fActiveTestFiles);
+				final List<TestFile> filesUnderTest = new ArrayList<>(fActiveTestFiles);
 				synchronized (TestSuite.this) {
 					while ((!fTerminated) && ((fCurrentTestCount > 0) || (!filesUnderTest.isEmpty()))) {
 
@@ -189,6 +189,7 @@
 
 				getScriptEngine().terminate();
 				setScriptEngine(null);
+				fSetupVariables = null;
 
 				setStatus(TestStatus.PASS);
 			}
@@ -208,7 +209,7 @@
 
 				if (result.hasException()) {
 					// testFile setup failed
-					final ArrayList<IScriptDebugFrame> trace = new ArrayList<IScriptDebugFrame>();
+					final ArrayList<IScriptDebugFrame> trace = new ArrayList<>();
 					// TODO eventually get the trace from the engine. Needs engine to keep traces on failures
 					trace.add(new ScriptDebugFrame(new Script("[" + identifier + "]", ""), 0, IScriptDebugFrame.TYPE_FILE));
 
@@ -280,7 +281,7 @@
 	public void run(final ITestSetFilter filter) {
 
 		// filter tests
-		fActiveTestFiles = new LinkedList<TestFile>();
+		fActiveTestFiles = new LinkedList<>();
 		for (final TestFile testFile : fTestFiles.values()) {
 			if (filter.matches(testFile))
 				fActiveTestFiles.add(testFile);
@@ -337,7 +338,7 @@
 	}
 
 	public List<TestFile> getActiveTestFiles() {
-		return new ArrayList<TestFile>(fActiveTestFiles);
+		return new ArrayList<>(fActiveTestFiles);
 	}
 
 	public void setErrorStream(final OutputStream errorStream) {