--- /dev/null
+package org.argeo.slc.core.test.tree;\r
+\r
+import java.util.Vector;\r
+\r
+import org.argeo.slc.core.structure.tree.TreeSPath;\r
+import org.argeo.slc.core.test.TestResult;\r
+import org.argeo.slc.core.test.TestResultId;\r
+import org.argeo.slc.core.test.TestResultListener;\r
+import org.argeo.slc.core.test.TestResultPart;\r
+\r
+public abstract class AsynchronousTreeTestResultListener implements\r
+ TestResultListener, Runnable {\r
+ private Vector<PartStruct> partStructs = new Vector<PartStruct>();\r
+ private Thread thread;\r
+\r
+ public void init() {\r
+ thread = new Thread(this);\r
+ thread.start();\r
+ }\r
+\r
+ public void destroy() {\r
+ thread = null;\r
+ synchronized (partStructs) {\r
+ partStructs.notifyAll();\r
+ }\r
+ }\r
+\r
+ public final void resultPartAdded(TestResult testResult,\r
+ TestResultPart testResultPart) {\r
+ TreeTestResult result = (TreeTestResult) testResult;\r
+ synchronized (partStructs) {\r
+ partStructs.add(new PartStruct(result.getCurrentPath(), result\r
+ .getTestResultId(), testResultPart, result));\r
+ partStructs.notifyAll();\r
+ }\r
+ }\r
+\r
+ public void run() {\r
+ while (thread != null) {\r
+ for (PartStruct partStruct : partStructs) {\r
+ resultPartAdded(partStruct);\r
+ }\r
+ \r
+ synchronized (partStructs) {\r
+ partStructs.clear();\r
+ while (partStructs.size() == 0) {\r
+ try {\r
+ partStructs.wait();\r
+ } catch (InterruptedException e) {\r
+ // silent\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ protected abstract void resultPartAdded(PartStruct partStruct);\r
+\r
+ protected static class PartStruct {\r
+ public final TreeSPath path;\r
+ public final TestResultId resultId;\r
+ public final TestResultPart part;\r
+ public final TreeTestResult result;\r
+\r
+ public PartStruct(TreeSPath path, TestResultId resultId,\r
+ TestResultPart part, TreeTestResult result) {\r
+ super();\r
+ this.path = path;\r
+ this.resultId = resultId;\r
+ this.part = part;\r
+ this.result = result;\r
+ }\r
+\r
+ }\r
+\r
+}\r