package com.redhat.ceylon.test.eclipse.plugin.model;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.eclipse.debug.core.ILaunch;
public class TestRunContainer {
private static final int MAX_RUNS_COUNT = 10;
private final List<TestRun> testRuns = new CopyOnWriteArrayList<TestRun>();
private final List<TestRunListener> testRunListeners = new CopyOnWriteArrayList<TestRunListener>();
public List<TestRunListener> getTestRunListeners() {
return Collections.unmodifiableList(testRunListeners);
}
public void addTestRunListener(TestRunListener testRunListener) {
testRunListeners.add(testRunListener);
}
public void removeTestRunListener(TestRunListener testRunListener) {
testRunListeners.remove(testRunListener);
}
public List<TestRun> getTestRuns() {
return Collections.unmodifiableList(testRuns);
}
public TestRun getTestRun(ILaunch launch) {
TestRun result = null;
for (TestRun testRun : testRuns) {
if (testRun.getLaunch() == launch) {
result = testRun;
break;
}
}
return result;
}
public TestRun getOrCreateTestRun(ILaunch launch) {
TestRun result = getTestRun(launch);
if (result == null) {
result = new TestRun(launch);
testRuns.add(0, result);
fireTestRunAdded(result);
if (testRuns.size() > MAX_RUNS_COUNT) {
List<TestRun> obsoleteRuns = testRuns.subList(MAX_RUNS_COUNT, testRuns.size());
for (TestRun obsoleteRun : obsoleteRuns) {
if (!obsoleteRun.isRunning() && !obsoleteRun.isPinned()) {
removeTestRun(obsoleteRun);
}
}
}
}
return result;
}
public void removeTestRun(TestRun testRun) {
if( testRun.isRunning() || testRun.isPinned() ) {
throw new IllegalStateException();
}
testRuns.remove(testRun);
fireTestRunRemoved(testRun);
}
private void fireTestRunAdded(TestRun testRun) {
for (TestRunListener testRunListener : testRunListeners) {
testRunListener.testRunAdded(testRun);
}
}
private void fireTestRunRemoved(TestRun testRun) {
for (TestRunListener testRunListener : testRunListeners) {
testRunListener.testRunRemoved(testRun);
}
}
}