+package org.argeo.slc.web.mvc.result;\r
+\r
+import java.util.SortedMap;\r
+import java.util.TreeMap;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import org.springframework.web.servlet.ModelAndView;\r
+import org.springframework.web.servlet.mvc.ParameterizableViewController;\r
+\r
+import org.argeo.slc.core.structure.StructureElement;\r
+import org.argeo.slc.core.structure.tree.TreeSPath;\r
+import org.argeo.slc.core.test.TestResultPart;\r
+import org.argeo.slc.core.test.TestStatus;\r
+import org.argeo.slc.core.test.tree.PartSubList;\r
+import org.argeo.slc.core.test.tree.TreeTestResult;\r
+import org.argeo.slc.dao.test.tree.TreeTestResultDao;\r
+\r
+public class ResultViewController extends ParameterizableViewController {\r
+ private final TreeTestResultDao testResultDao;\r
+\r
+ public ResultViewController(TreeTestResultDao testResultDao) {\r
+ this.testResultDao = testResultDao;\r
+ }\r
+\r
+ @Override\r
+ protected ModelAndView handleRequestInternal(HttpServletRequest request,\r
+ HttpServletResponse response) throws Exception {\r
+\r
+ String uuid = request.getParameter("uuid");\r
+ TreeTestResult result = testResultDao.getTestResult(uuid);\r
+\r
+ SortedMap<TreeSPath, String> toc = generateToc(result);\r
+\r
+ SortedMap<TreeSPath, String> describedPaths = new TreeMap<TreeSPath, String>();\r
+ for (TreeSPath path : toc.keySet()) {\r
+ describedPaths.put(path, describedPath(path, result));\r
+ }\r
+\r
+ SortedMap<TreeSPath, String> anchors = new TreeMap<TreeSPath, String>();\r
+ for (TreeSPath path : toc.keySet()) {\r
+ anchors.put(path, anchor(path));\r
+ }\r
+\r
+ ModelAndView modelAndView = new ModelAndView();\r
+\r
+ modelAndView.addObject("result", result);\r
+ modelAndView.addObject("toc", toc);\r
+ modelAndView.addObject("describedPaths", describedPaths);\r
+ modelAndView.addObject("anchors", anchors);\r
+ modelAndView.setViewName(getViewName());\r
+ return modelAndView;\r
+ }\r
+\r
+ private SortedMap<TreeSPath, String> generateToc(TreeTestResult result) {\r
+ SortedMap<TreeSPath, String> toc = new TreeMap<TreeSPath, String>();\r
+ for (TreeSPath path : result.getResultParts().keySet()) {\r
+ PartSubList subList = (PartSubList) result.getResultParts().get(\r
+ path);\r
+ boolean isFailed = false;\r
+ for (TestResultPart part : subList.getParts()) {\r
+ if (!part.getStatus().equals(TestStatus.PASSED)) {\r
+ isFailed = true;\r
+ break;\r
+ }\r
+ }\r
+ fillToc(toc, path, isFailed);\r
+ }\r
+ return toc;\r
+ }\r
+\r
+ private void fillToc(SortedMap<TreeSPath, String> toc, TreeSPath path,\r
+ boolean isFailed) {\r
+ if (isFailed) {\r
+ toc.put(path, "failed");\r
+ } else {\r
+ if (!toc.containsKey(path)) {\r
+ toc.put(path, "passed");\r
+ }\r
+ }\r
+\r
+ if (path.getParent() != null) {\r
+ fillToc(toc, path.getParent(), isFailed);\r
+ }\r
+ }\r
+\r
+ private static String anchor(TreeSPath path) {\r
+ return path.getAsUniqueString().replace(path.getSeparator(), '_');\r
+ }\r
+\r
+ private static String describedPath(TreeSPath path, TreeTestResult ttr) {\r
+ StringBuffer buf = new StringBuffer("");\r
+ // TODO :optimize with hierarichy\r
+ describedPath(path, buf, ttr);\r
+ return buf.toString();\r
+ }\r
+\r
+ private static void describedPath(TreeSPath path, StringBuffer buf,\r
+ TreeTestResult ttr) {\r
+ if (path.getParent() != null) {\r
+ describedPath(path.getParent(), buf, ttr);\r
+ }\r
+ String description = path.getName();\r
+ StructureElement element = ttr.getElements().get(path);\r
+ if (element != null) {\r
+ description = element.getLabel();\r
+ }\r
+ buf.append('/').append(description);\r
+ }\r
+\r
+}\r