import org.argeo.slc.core.test.TestResultListener;\r
import org.argeo.slc.core.test.TestResultPart;\r
\r
+/**\r
+ * Abstract asynchronous implementation of a listener listening to a\r
+ * <code>TreeTestResult</code>.\r
+ * \r
+ * @see TreeTestResult\r
+ */\r
public abstract class AsynchronousTreeTestResultListener implements\r
TestResultListener, Runnable {\r
private Vector<PartStruct> partStructs = new Vector<PartStruct>();\r
private Thread thread;\r
\r
+ /** Starts the underlying thread. */\r
public void init() {\r
thread = new Thread(this);\r
thread.start();\r
}\r
\r
- public void destroy() {\r
- thread = null;\r
+ /** Finish the remaining and destroy */\r
+ public void close(TestResult testResult) {\r
synchronized (partStructs) {\r
+ // TODO: put a timeout\r
+ while (partStructs.size() != 0) {\r
+ try {\r
+ partStructs.wait(500);\r
+ } catch (InterruptedException e) {\r
+ // silent\r
+ }\r
+ }\r
+ thread = null;\r
partStructs.notifyAll();\r
}\r
+ postClose((TreeTestResult) testResult);\r
}\r
\r
public final void resultPartAdded(TestResult testResult,\r
}\r
}\r
\r
+ /** Called when a result part has been added. */\r
+ protected abstract void resultPartAdded(PartStruct partStruct);\r
+\r
+ /**\r
+ * Called at the end of close. Default implementation is empty. To be\r
+ * overridden.\r
+ */\r
+ protected void postClose(TreeTestResult testResult) {\r
+\r
+ }\r
+\r
public void run() {\r
while (thread != null) {\r
synchronized (partStructs) {\r
}\r
\r
partStructs.clear();\r
+ partStructs.notifyAll();\r
while (partStructs.size() == 0) {\r
try {\r
partStructs.wait();\r
}\r
}\r
\r
- protected abstract void resultPartAdded(PartStruct partStruct);\r
-\r
+ /** Structure used to pass tree specific information to subclasses. */\r
protected static class PartStruct {\r
+ /** The tree path of this part. */\r
public final TreeSPath path;\r
+ /** The test result id of the related test result */\r
public final NumericTRId resultId;\r
+ /** The part itself */\r
public final TestResultPart part;\r
+ /** The tree test result itself. */\r
public final TreeTestResult result;\r
\r
+ /** Constructor */\r
public PartStruct(TreeSPath path, NumericTRId resultId,\r
TestResultPart part, TreeTestResult result) {\r
super();\r