]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultPersister.java
Manage with Maven
[gpl/argeo-slc.git] / org.argeo.slc / src / main / java / org / argeo / slc / core / test / tree / TreeTestResultPersister.java
index 16ec6facda707373ac4eb320640309b16642d658..ca92b49084e9f045fcc5ed824e2d1b0987a2b7d5 100644 (file)
 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