package org.argeo.slc.core.test.tree;\r
\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
+import org.argeo.slc.core.structure.SimpleSElement;\r
+import org.argeo.slc.core.structure.StructureRegistry;\r
+import org.argeo.slc.core.structure.tree.TreeSPath;\r
+import org.argeo.slc.core.structure.tree.TreeSRegistry;\r
+import org.argeo.slc.dao.structure.tree.TreeSPathDao;\r
+import org.argeo.slc.dao.structure.tree.TreeSRegistryDao;\r
import org.argeo.slc.dao.test.TestResultDao;\r
\r
+/**\r
+ * Listener persisting tree-based results.\r
+ * \r
+ * @see TreeTestResult\r
+ */\r
public class TreeTestResultPersister extends AsynchronousTreeTestResultListener {\r
+ private static Log log = LogFactory.getLog(TreeTestResultPersister.class);\r
+\r
private TestResultDao testResultDao;\r
+ private TreeSPathDao treeSPathDao;\r
+ private TreeSRegistryDao treeSRegistryDao;\r
\r
@Override\r
protected void resultPartAdded(PartStruct partStruct) {\r
- TreeTestResult persistedResult = (TreeTestResult) testResultDao\r
- .getTestResult(partStruct.resultId);\r
- if (persistedResult == null) {\r
- persistedResult = new TreeTestResult();\r
- persistedResult.setNumericResultId(partStruct.resultId);\r
- PartSubList subList = new PartSubList();\r
- subList.getParts().add(partStruct.part);\r
- persistedResult.getResultParts().put(partStruct.path, subList);\r
-\r
- testResultDao.create(persistedResult);\r
- } else {\r
- PartSubList subList = persistedResult.getResultParts().get(\r
- partStruct.path);\r
- if (subList == null) {\r
- subList = new PartSubList();\r
- persistedResult.getResultParts().put(partStruct.path, subList);\r
+ try {\r
+ TreeTestResult persistedResult = (TreeTestResult) testResultDao\r
+ .getTestResult(partStruct.resultId);\r
+\r
+ TreeSPath path = treeSPathDao.getOrCreate(partStruct.path);\r
+\r
+ StructureRegistry localRegistry = partStruct.result.getRegistry();\r
+ TreeSRegistry registry = getOrCreateTreeSRegistry(path);\r
+ syncPath(registry, localRegistry, path);\r
+\r
+ if (persistedResult == null) {\r
+ persistedResult = new TreeTestResult();\r
+ persistedResult.setNumericResultId(partStruct.resultId);\r
+ PartSubList subList = new PartSubList();\r
+ subList.getParts().add(partStruct.part);\r
+ persistedResult.getResultParts().put(path, subList);\r
+\r
+ testResultDao.create(persistedResult);\r
+ } else {\r
+ PartSubList subList = persistedResult.getResultParts()\r
+ .get(path);\r
+ if (subList == null) {\r
+ subList = new PartSubList();\r
+ persistedResult.getResultParts().put(path, subList);\r
+ }\r
+ persistedResult.getResultParts().get(path).getParts().add(\r
+ partStruct.part);\r
+\r
+ if (log.isTraceEnabled()) {\r
+ log.trace("ResultId:" + persistedResult.getTestResultId());\r
+ log.trace("ResultParts size:"\r
+ + persistedResult.getResultParts().size());\r
+ log.trace("Sublist size:" + subList.getParts().size());\r
+ log.trace("Part: " + partStruct.part);\r
+ }\r
+ testResultDao.update(persistedResult);\r
}\r
- subList.getParts().add(partStruct.part);\r
+ } catch (Exception e) {\r
+ log.error("Could not persist part for result #"\r
+ + partStruct.resultId, e);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void postClose(TreeTestResult testResult) {\r
+ TreeTestResult persistedResult = (TreeTestResult) testResultDao\r
+ .getTestResult(testResult.getTestResultId());\r
\r
+ if (persistedResult != null) {\r
+ persistedResult.setCloseDate(testResult.getCloseDate());\r
testResultDao.update(persistedResult);\r
}\r
+ if (log.isDebugEnabled())\r
+ log.debug("Closed result persister for result "\r
+ + testResult.getNumericResultId());\r
}\r
\r
+ private TreeSRegistry getOrCreateTreeSRegistry(TreeSPath path) {\r
+ TreeSRegistry registry = treeSRegistryDao.getTreeSRegistry(path);\r
+ if (registry == null) {\r
+ registry = new TreeSRegistry();\r
+ TreeSPath root = treeSPathDao.getOrCreate(path.getRoot());\r
+ registry.setRoot(root);\r
+ treeSRegistryDao.create(registry);\r
+ return treeSRegistryDao.getTreeSRegistry(path);\r
+ } else {\r
+ return registry;\r
+ }\r
+ }\r
+\r
+ /** Sets the DAO to use in order to persist the results. */\r
public void setTestResultDao(TestResultDao testResultDao) {\r
this.testResultDao = testResultDao;\r
}\r
\r
+ /** Sets the tree structure path DAO. */\r
+ public void setTreeSPathDao(TreeSPathDao treeSPathDao) {\r
+ this.treeSPathDao = treeSPathDao;\r
+ }\r
+\r
+ /** Sets the tree structure registry DAO. */\r
+ public void setTreeSRegistryDao(TreeSRegistryDao treeSRegistryDao) {\r
+ this.treeSRegistryDao = treeSRegistryDao;\r
+ }\r
+\r
+ private void syncPath(TreeSRegistry registry,\r
+ StructureRegistry localRegistry, TreeSPath path) {\r
+ if (path.getParent() != null) {\r
+ TreeSPath parent = treeSPathDao.getOrCreate(path.getParent());\r
+ syncPath(registry, localRegistry, parent);\r
+ }\r
+\r
+ if (registry.getElement(path) == null) {\r
+ if (localRegistry != null) {\r
+ registry.register(path, localRegistry.getElement(path));\r
+ } else {\r
+ registry.register(path, new SimpleSElement(path.getName()));\r
+ }\r
+ treeSRegistryDao.update(registry);\r
+ }\r
+\r
+ }\r
}\r