Improve reporting
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 18 Nov 2007 11:51:03 +0000 (11:51 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 18 Nov 2007 11:51:03 +0000 (11:51 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@717 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSPath.java
org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/TreeTestResultPersister.java
org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultPage.java
org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/ResultsList.java
org.argeo.slc/src/main/java/org/argeo/slc/core/test/tree/htmlreport/style.css

index f28c843cfc76d189688e510275b95ae6cd06505d..2efeb152709811306829e1113b2f5228e58072f0 100644 (file)
@@ -68,6 +68,7 @@ public class TreeSPath implements StructurePath, Comparable<StructurePath> {
                path.name = name;\r
                return path;\r
        }\r
+\r
        /** Parses a string to a path. */\r
        public static TreeSPath parseToCreatePath(String path) {\r
                return parseToCreatePath(path, DEFAULT_SEPARATOR);\r
@@ -117,6 +118,19 @@ public class TreeSPath implements StructurePath, Comparable<StructurePath> {
                return root;\r
        }\r
 \r
+       /** Depth of this path. */\r
+       public Integer depth() {\r
+               return depthImpl(this);\r
+       }\r
+\r
+       private static int depthImpl(TreeSPath path) {\r
+               if (path.getParent() == null) {\r
+                       return 1;\r
+               } else {\r
+                       return depthImpl(path.getParent()) + 1;\r
+               }\r
+       }\r
+\r
        @Override\r
        public String toString() {\r
                return getAsUniqueString();\r
index 29c73d2fff2e73aadd45abcbef3452d026ae62cf..68c2ada699ebc1191f0f25aca05691a025dba42f 100644 (file)
@@ -31,17 +31,10 @@ public class TreeTestResultPersister extends AsynchronousTreeTestResultListener
 \r
                        TreeSPath path = treeSPathDao.getOrCreate(partStruct.path);\r
 \r
+                       StructureRegistry localRegistry = partStruct.result.getRegistry();\r
                        TreeSRegistry registry = getOrCreateTreeSRegistry(path);\r
-                       if (registry.getElement(path) == null) {\r
-                               StructureRegistry localRegistry = partStruct.result\r
-                                               .getRegistry();\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
+                       syncPath(registry, localRegistry, path);\r
+                       treeSRegistryDao.update(registry);\r
 \r
                        if (persistedResult == null) {\r
                                persistedResult = new TreeTestResult();\r
@@ -118,4 +111,19 @@ public class TreeTestResultPersister extends AsynchronousTreeTestResultListener
                this.treeSRegistryDao = treeSRegistryDao;\r
        }\r
 \r
+       private void syncPath(TreeSRegistry registry,\r
+                       StructureRegistry localRegistry, TreeSPath path) {\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
+               }\r
+\r
+               if (path.getParent() != null) {\r
+                       TreeSPath parent = treeSPathDao.getOrCreate(path.getParent());\r
+                       syncPath(registry, localRegistry, parent);\r
+               }\r
+       }\r
 }\r
index c03a458e3ed075b89afed6e06a5a6d31ceeee50f..06bf7c30d3cffe37dcccb48d7dc7d1b91eba8f30 100644 (file)
@@ -1,17 +1,27 @@
 package org.argeo.slc.core.test.tree.htmlreport;\r
 \r
-import java.io.FileWriter;\r
 import java.io.IOException;\r
+import java.util.SortedMap;\r
+import java.util.TreeMap;\r
+\r
+import javax.swing.tree.TreePath;\r
+\r
+import org.apache.commons.io.FileUtils;\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
 \r
 import org.argeo.slc.core.structure.StructureElement;\r
 import org.argeo.slc.core.structure.StructureRegistry;\r
 import org.argeo.slc.core.structure.tree.TreeSPath;\r
 import org.argeo.slc.core.test.SimpleResultPart;\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
 \r
 class ResultPage {\r
+       private final static Log log = LogFactory.getLog(ResultPage.class);\r
+\r
        private final FullHtmlTreeReport report;\r
        private final TreeTestResult result;\r
 \r
@@ -40,56 +50,133 @@ class ResultPage {
 \r
                buf.append("<body>\n");\r
 \r
+               // Header\r
                buf.append("<h1>Result #").append(result.getTestResultId()).append(\r
                                "</h1>\n");\r
+               buf.append(report.sdf.format(result.getCloseDate()));\r
+\r
+               // TOC\r
+               generateToc(buf, registry);\r
+\r
+               generatePartsList(buf, registry);\r
+\r
+               buf.append("</body>");\r
+               buf.append("</html>");\r
+\r
+               try {\r
+                       FileUtils.writeStringToFile(report.getResultFile(result), buf\r
+                                       .toString());\r
+               } catch (IOException e) {\r
+                       log.error("Could not save result page.", e);\r
+               }\r
+       }\r
 \r
-               buf.append("<table border=1>\n");\r
+       private void generateToc(StringBuffer buf, StructureRegistry registry) {\r
+               buf.append("<h2>Overview</h2>\n");\r
+               SortedMap<TreeSPath, Integer> toc = new TreeMap<TreeSPath, Integer>();\r
                for (TreeSPath path : result.getResultParts().keySet()) {\r
-                       buf.append("<tr><td>");\r
-                       buf.append(path);\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
+\r
+               buf.append("<table border=\"0\">\n");\r
+               for (TreeSPath path : toc.keySet()) {\r
+                       boolean inResult = result.getResultParts().containsKey(path);\r
+                       boolean isFailed = !toc.get(path).equals(TestStatus.PASSED);\r
+\r
+                       buf.append("<tr><td class=\"").append(\r
+                                       isFailed ? "failed" : "passed").append("\">");\r
+                       int depth = path.depth();\r
+                       for (int i = 0; i < depth; i++) {\r
+                               buf.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");\r
+                       }\r
+\r
+                       if (inResult) {\r
+                               buf.append("<a href=\"#").append(anchor(path)).append(\r
+                                               "\" class=\"").append(isFailed ? "failed" : "passed")\r
+                                               .append("\"><b>");\r
+                       }\r
                        if (registry != null) {\r
                                StructureElement element = registry.getElement(path);\r
                                if (element != null) {\r
-                                       buf.append("<br/><b>");\r
                                        buf.append(element.getDescription());\r
-                                       buf.append("</b>");\r
+                               } else {\r
+                                       buf.append(path.getName());\r
+                               }\r
+                       }\r
+                       if (inResult) {\r
+                               buf.append("</b></a>");\r
+                       }\r
+                       buf.append("</td></tr>\n");\r
+               }\r
+               buf.append("</table>\n");\r
+               buf.append("<hr/>\n");\r
+       }\r
+\r
+       private void generatePartsList(StringBuffer buf, StructureRegistry registry) {\r
+               for (TreeSPath path : result.getResultParts().keySet()) {\r
+                       buf.append("<p>\n");\r
+                       buf.append("<a name=\"").append(anchor(path)).append("\"></a>");\r
+                       buf.append("<h2>");\r
+                       String description = path.getName();\r
+                       if (registry != null) {\r
+                               StructureElement element = registry.getElement(path);\r
+                               if (element != null) {\r
+                                       description = element.getDescription();\r
                                }\r
                        }\r
-                       buf.append("</td>\n");\r
-                       buf.append("<td>");\r
+                       buf.append(description);\r
+                       buf.append("</h2>");\r
+\r
                        PartSubList subList = (PartSubList) result.getResultParts().get(\r
                                        path);\r
                        buf.append("<table border=0>\n");\r
                        for (TestResultPart part : subList.getParts()) {\r
                                SimpleResultPart sPart = (SimpleResultPart) part;\r
-                               String color = "yellow";\r
+                               String clss = "";\r
                                if (sPart.getStatus().equals(SimpleResultPart.PASSED)) {\r
-                                       color = "green";\r
+                                       clss = "passed";\r
                                } else {\r
-                                       color = "red";\r
+                                       clss = "failed";\r
                                }\r
-                               buf.append("<tr><td style=\"color:").append(color)\r
-                                               .append("\">");\r
+                               buf.append("<tr><td class=\"").append(clss).append("\">");\r
 \r
                                buf.append(sPart.getMessage());\r
                                buf.append("</td></tr>\n");\r
                        }\r
                        buf.append("</table>\n");\r
-\r
-                       buf.append("</td></tr>\n");\r
                }\r
-               buf.append("</table>\n");\r
+       }\r
 \r
-               buf.append("</body>");\r
-               buf.append("</html>");\r
+       private void fillToc(SortedMap<TreeSPath, Integer> toc, TreeSPath path,\r
+                       boolean isFailed) {\r
+               if (isFailed) {\r
+                       toc.put(path, TestStatus.FAILED);\r
+               } else {\r
+                       if (!toc.containsKey(path)) {\r
+                               toc.put(path, TestStatus.PASSED);\r
+                       }\r
+               }\r
 \r
-               try {\r
-                       FileWriter writer = new FileWriter(report.getResultFile(result));\r
-                       writer.write(buf.toString());\r
-                       writer.close();\r
-               } catch (IOException e) {\r
-                       e.printStackTrace();\r
+               if (path.getParent() != null) {\r
+                       fillToc(toc, path.getParent(), isFailed);\r
                }\r
        }\r
 \r
+       private String anchor(TreeSPath path) {\r
+               return path.getAsUniqueString().replace(path.getSeparator(), '_');\r
+       }\r
+\r
+       private String describedPath(TreePath path, StructureRegistry registry) {\r
+               StringBuffer buf = new StringBuffer("");\r
+               return buf.toString();\r
+       }\r
 }\r
index e191f5fb42b1e22daa399409a6cdc084672edcdc..f2a75164107368d4f7cdaa84444d73207b44ab4b 100644 (file)
@@ -24,7 +24,7 @@ class ResultsList {
                buf.append("<body>\n");\r
 \r
                buf.append("<h1>Results</h1>\n");\r
-               buf.append("<table border=\"1\" cellspacing=\"0\">\n");\r
+               buf.append("<table border=\"0\" cellspacing=\"1\">\n");\r
        }\r
 \r
        void addTestResult(TreeTestResult result) {\r
@@ -32,17 +32,17 @@ class ResultsList {
                // Date\r
                buf.append("<td>");\r
                Date closeDate = result.getCloseDate();\r
-               if(closeDate == null){\r
+               if (closeDate == null) {\r
                        throw new SlcException("No close date");\r
                }\r
                buf.append(report.sdf.format(closeDate));\r
                buf.append("</td>\n");\r
                // Id and link\r
-               buf.append("<td><a href=\"");\r
+               buf.append("<td><a class=\"nav\" href=\"");\r
                buf.append(report.getResultFile(result).getName());\r
-               buf.append("\" target=\"main\">");\r
+               buf.append("\" target=\"main\">#");\r
                buf.append(result.getTestResultId()).append("</a></td>\n");\r
-               \r
+\r
                buf.append("</tr>\n");\r
        }\r
 \r
index d7e7730bc95545c9ff39536e3d4dbcaca8999d17..26d5ae2bdbe6f2f01c4cc51ee3e46fa8b27ab283 100644 (file)
@@ -65,87 +65,24 @@ td {
        text-align: left;\r
 }\r
 \r
-/**************** Navigation ****************/\r
-td.nav1 {\r
-       padding: 5px 0px 0px 0px;\r
-       font-size: 12px;\r
-       font-weight: bold;\r
-}\r
-\r
-td.nav2 {\r
-       padding: 0px 0px 0px 5px;\r
-       font-size: 12px;\r
-}\r
-\r
-/**************** Forms ****************/\r
-input.submit {\r
-       border: solid 1px grey;\r
-       background-color: lightgrey;\r
-       align: right;\r
-}\r
-\r
-input.submit:hover {\r
-       border: solid 1px #3399FF;\r
-       background-color: white;\r
-       color: #3399FF;\r
-}\r
-\r
-input.std {\r
-       border: solid 1px lightgrey;\r
-       padding: 1px;\r
-       margin: 2px;\r
+.passed {\r
+       color: green;\r
 }\r
 \r
-.formError {\r
+.failed {\r
        color: red;\r
-       padding: 1px;\r
-       margin: 2px;\r
-       font-weight: bold;\r
 }\r
 \r
 /**************** Pseudo classes ****************/\r
-a:link {\r
-       color: #0066CC;\r
+a {\r
        text-decoration: none;\r
 }\r
 \r
-a:visited {\r
+a.nav {\r
        color: #0066CC;\r
        text-decoration: none;\r
 }\r
 \r
 a:hover {\r
-       color: #3399FF;\r
-       text-decoration: none;\r
-}\r
-\r
-/************************* ID's *************************/\r
-#main {\r
-       position: absolute;\r
-       margin-left: 180px;\r
-       padding-top: 65px;\r
-}\r
-\r
-#navigation {\r
-       position: absolute;\r
-       width: 150px;\r
-       height: 800px;\r
-       border-right: 1px solid #0066CC;\r
-       font-weight: normal;\r
-       margin-top: 60px;\r
-       margin-left: 10px;\r
-}\r
-\r
-#banner {\r
-       position: absolute;\r
-       width: 400px;\r
-       height: 50px;\r
-}\r
-\r
-#upperRight {\r
-       position: absolute;\r
-       top: 0;\r
-       right: 0;\r
-       margin-top: 20px;\r
-       margin-right: 10px;\r
+       text-decoration: underline;\r
 }
\ No newline at end of file