diff --git a/pom.xml b/pom.xml
index 4bdbe4f..ee0400b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.google.pdsl
pdsl
- 1.8.2
+ 1.8.3-SNAPSHOT
pdsl
http://www.github.com/google/polymorphicDSL
diff --git a/src/main/java/com/pdsl/executors/DefaultPolymorphicDslTestExecutor.java b/src/main/java/com/pdsl/executors/DefaultPolymorphicDslTestExecutor.java
index f5aab1b..1e96acc 100644
--- a/src/main/java/com/pdsl/executors/DefaultPolymorphicDslTestExecutor.java
+++ b/src/main/java/com/pdsl/executors/DefaultPolymorphicDslTestExecutor.java
@@ -1,6 +1,5 @@
package com.pdsl.executors;
-import com.pdsl.logging.AnsiTerminalColorHelper;
import com.pdsl.logging.PdslThreadSafeOutputStream;
import com.pdsl.reports.DefaultTestResult;
import com.pdsl.reports.MetadataTestRunResults;
@@ -9,25 +8,17 @@
import com.pdsl.specifications.DefaultPhrase;
import com.pdsl.specifications.FilteredPhrase;
import com.pdsl.specifications.Phrase;
-import com.pdsl.specifications.PolymorphicDslTransformationException;
import com.pdsl.testcases.SharedTestCase;
import com.pdsl.testcases.SharedTestSuite.SharedTestCaseWithInterpreter;
import com.pdsl.testcases.TestCase;
import com.pdsl.testcases.TestSection;
-
-import java.util.stream.Collectors;
-
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeListener;
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* An executor that runs PDSL tests create from a TestCaseFactory.
@@ -40,8 +31,9 @@
public class DefaultPolymorphicDslTestExecutor implements TraceableTestRunExecutor, ActivePhraseObservable {
private final ParseTreeWalker walker = new ParseTreeWalker();
- private static final Charset DEFAULT_CHARSET = Charset.defaultCharset();
- private final List activePhraseObservers = new ArrayList<>();
+ // In concurrent test cases an observer might be added to the collection while it's being read from
+ // Use a type that is safe for concurrency.
+ private final List activePhraseObservers = new CopyOnWriteArrayList<>();
/**
* Constructs a DefaultPolymorphicDslTestExecutor with a default ColorizedObserver.
diff --git a/src/main/java/com/pdsl/executors/ExecutorObserver.java b/src/main/java/com/pdsl/executors/ExecutorObserver.java
index 67c2f6a..838dabd 100644
--- a/src/main/java/com/pdsl/executors/ExecutorObserver.java
+++ b/src/main/java/com/pdsl/executors/ExecutorObserver.java
@@ -1,7 +1,6 @@
package com.pdsl.executors;
import com.pdsl.reports.MetadataTestRunResults;
-import com.pdsl.specifications.Phrase;
import com.pdsl.testcases.SharedTestCase;
import com.pdsl.testcases.TestCase;
import com.pdsl.testcases.TestSection;
@@ -52,8 +51,8 @@ default void onAfterPhrase(ParseTreeListener listener,
ParseTreeWalker walker, TestSection testSection) {}
/** Notifies the implementer of a phrase that has completed execution with a visitor WITHOUT an exception. */
- void onAfterPhrase(ParseTreeVisitor> visitor,
- TestSection testSection);
+ default void onAfterPhrase(ParseTreeVisitor> visitor,
+ TestSection testSection) {}
/** Notifies the implementer of a phrase that has failed during excecution with a listener. */
default void onPhraseFailure(ParseTreeListener listener,