You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2005/11/08 22:57:33 UTC

svn commit: r331903 [1/2] - in /geronimo/gbuild/trunk: ./ src/main/java/org/apache/geronimo/gbuild/report/ src/main/report-resources/ src/main/resources/ src/main/resources/org/ src/main/resources/org/apache/ src/main/resources/org/apache/geronimo/ src...

Author: dain
Date: Tue Nov  8 13:57:27 2005
New Revision: 331903

URL: http://svn.apache.org/viewcvs?rev=331903&view=rev
Log:
Distributed results report

Added:
    geronimo/gbuild/trunk/maven.xml   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/GenerateReport.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportFileLocator.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportUtil.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/Section.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SectionManager.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportLoader.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportUtil.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestCase.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestSuite.java   (with props)
    geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/WorkDirLoader.java   (with props)
    geronimo/gbuild/trunk/src/main/report-resources/
    geronimo/gbuild/trunk/src/main/report-resources/h3.gif   (with props)
    geronimo/gbuild/trunk/src/main/report-resources/icon_error_sml.gif   (with props)
    geronimo/gbuild/trunk/src/main/report-resources/icon_info_sml.gif   (with props)
    geronimo/gbuild/trunk/src/main/report-resources/icon_success_sml.gif   (with props)
    geronimo/gbuild/trunk/src/main/report-resources/icon_warning_sml.gif   (with props)
    geronimo/gbuild/trunk/src/main/report-resources/maven-base.css
    geronimo/gbuild/trunk/src/main/report-resources/maven-stylus.css
    geronimo/gbuild/trunk/src/main/report-resources/print.css
    geronimo/gbuild/trunk/src/main/report-resources/spacer.gif   (with props)
    geronimo/gbuild/trunk/src/main/resources/
    geronimo/gbuild/trunk/src/main/resources/org/
    geronimo/gbuild/trunk/src/main/resources/org/apache/
    geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/
    geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/
    geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/
    geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/all-xml.vm
    geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/macros.vm
    geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/summary.vm   (with props)
    geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/testsuite.vm   (with props)
    geronimo/gbuild/trunk/src/test/java/org/apache/geronimo/gbuild/report/
    geronimo/gbuild/trunk/src/test/java/org/apache/geronimo/gbuild/report/RelativePathTest.java   (with props)
Modified:
    geronimo/gbuild/trunk/project.xml

Added: geronimo/gbuild/trunk/maven.xml
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/maven.xml?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/maven.xml (added)
+++ geronimo/gbuild/trunk/maven.xml Tue Nov  8 13:57:27 2005
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+
+    Copyright 2003-2005 The Apache Software Foundation
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<project default="jar:install"
+    xmlns:ant="jelly:ant"
+    >
+
+    <postGoal name="java:jar-resources">
+      <ant:mkdir dir="${maven.build.dest}/META-INF/org/apache/geronimo/gbuild/report"/>
+      <ant:zip destfile="${maven.build.dest}/META-INF/org/apache/geronimo/gbuild/report/resources.zip">
+          <ant:fileset dir="${basedir}/src/main/report-resources"/>
+      </ant:zip>
+    </postGoal>
+</project>

Propchange: geronimo/gbuild/trunk/maven.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: geronimo/gbuild/trunk/project.xml
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/project.xml?rev=331903&r1=331902&r2=331903&view=diff
==============================================================================
--- geronimo/gbuild/trunk/project.xml (original)
+++ geronimo/gbuild/trunk/project.xml Tue Nov  8 13:57:27 2005
@@ -3,9 +3,9 @@
 <project>
 
   <pomVersion>3</pomVersion>
-  <id>gbuild</id>
-  <name>gbuild</name>
-  <currentVersion>1.0</currentVersion>
+  <groupId>org.apache.geronimo.gbuild</groupId>
+  <artifactId>gbuild</artifactId>
+  <currentVersion>1.0-SNAPSHOT</currentVersion>
   <shortDescription>gbuild</shortDescription>
   <description>gbuild</description>
   <url></url>
@@ -133,11 +133,16 @@
       <version>2.6.2</version>
     </dependency>
 
+    <dependency>
+      <groupId>velocity</groupId>
+      <artifactId>velocity</artifactId>
+      <version>1.4</version>
+    </dependency>
 <!--
     <dependency>
       <groupId>org.apache.maven.continuum</groupId>
       <artifactId>continuum-core</artifactId>
-      <version>1.0-SNAPSHOT</version>
+      <version>1.0</version>
     </dependency>
 -->
   </dependencies>
@@ -146,22 +151,17 @@
     <unitTestSourceDirectory>src/test/java</unitTestSourceDirectory>
     <nagEmailAddress>scm@geronimo.apache.org</nagEmailAddress>
 
+    <resources>
+      <resource>
+        <directory>${basedir}/src/main/resources</directory>
+      </resource>
+    </resources>
+
     <unitTest>
       <includes>
         <include>**/*Test.java</include>
       </includes>
     </unitTest>
-
-    <resources>
-<!--
-      <resource>
-        <directory>.</directory>
-        <includes>
-          <include>*</include>
-        </includes>
-      </resource>
--->
-    </resources>
   </build>
 
 </project>

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/GenerateReport.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/GenerateReport.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/GenerateReport.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/GenerateReport.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,250 @@
+package org.apache.geronimo.gbuild.report;
+
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+import org.apache.velocity.app.VelocityEngine;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+
+/**
+ * @version $Revision$ $Date$
+ */
+public class GenerateReport {
+    private final File sectionsFile;
+    private final File workDir;
+    private final File reportsDir;
+    private final File outputDir;
+    private final boolean forceHtml = false;
+
+    public GenerateReport(File sectionsFile, File workDir, File reportsDir, File outputDir) {
+        this.sectionsFile = sectionsFile;
+        this.workDir = workDir;
+        this.reportsDir = reportsDir;
+        this.outputDir = outputDir;
+    }
+
+    public static void main(String[] args) throws Exception {
+        long processStart = System.currentTimeMillis();
+
+        if (args.length != 4) {
+            System.out.println("Usage:");
+            System.out.println("    java org.apache.geronimo.gbuild.report.ProcessResults sectionsFile workDir reportsDir outputDir");
+            System.out.println(Arrays.asList(args));
+            return;
+        }
+
+        // sections file
+        File sectionsFile = new File(args[0]);
+        if (!sectionsFile.canRead()) {
+            System.out.println("sectionsFile is not a readable: " + sectionsFile.getAbsolutePath());
+            return;
+        }
+
+        // work directory
+        File workDir = new File(args[1]);
+        if (workDir.exists() && !workDir.isDirectory()) {
+            System.out.println("workDir is not a directory: " + workDir.getAbsolutePath());
+            return;
+        }
+
+        // reports dir
+        File reportsDir = new File(args[2]);
+        if (!reportsDir.isDirectory()) {
+            System.out.println("reportsDir is not a directory: " + reportsDir.getAbsolutePath());
+            return;
+        }
+
+        // output directory
+        File outputDir = new File(args[3]);  
+        if (!outputDir.exists()) {
+            if (!outputDir.mkdirs()) {
+                System.out.println("Could not create outputDir: " + outputDir.getAbsolutePath());
+                return;
+            }
+        }
+        if (!outputDir.isDirectory()) {
+            System.out.println("outputDir is not a directory: " + outputDir.getAbsolutePath());
+            return;
+        }
+
+        new GenerateReport(sectionsFile, workDir, reportsDir, outputDir).execute();
+        System.out.println("Elapsed time: " + (System.currentTimeMillis() - processStart) / 1000 + " sec");
+    }
+
+    public void execute() throws Exception {
+        // load all of the result from your working directory
+        ReportFileLocator reportFileLocator = new ReportFileLocator(workDir);
+        long begin;
+        SortedSet workTestCases = new TreeSet();
+        if (workDir != null) {
+            begin = System.currentTimeMillis();
+            WorkDirLoader workDirLoader = new WorkDirLoader(workDir, true, reportFileLocator);
+            workTestCases = workDirLoader.loadTestCases();
+            System.out.println("Loaded " + workTestCases.size() + " tests from " + workDir.getName() + " in " + (System.currentTimeMillis() - begin) / 1000 + " sec");
+        }
+
+
+        // load the existing test cases from the reports
+        begin = System.currentTimeMillis();
+        SummaryReportLoader summaryReportLoader = new SummaryReportLoader(reportsDir, false, reportFileLocator);
+        SortedSet reportsTestCases = summaryReportLoader.loadTestCases();
+        System.out.println("Loaded " + reportsTestCases.size() + " tests from " + reportsDir.getName() + " in " + (System.currentTimeMillis() - begin) / 1000 + " sec");
+
+        // merge the test cases
+        SortedSet testCases = ReportUtil.mergeTestCases(workTestCases, reportsTestCases);
+
+        // write work summary
+        SummaryReportUtil.saveTestCases(workTestCases, new File(outputDir, "work.properties"));
+
+        // create the section manager
+        SortedMap sectionNamesByPackage = new TreeMap(ReportUtil.loadProperties(sectionsFile));
+        SectionManager sectionManager = new SectionManager(sectionNamesByPackage, testCases);
+
+        // unpack resources
+        ReportUtil.unpackEmbeddedZip("META-INF/org/apache/geronimo/gbuild/report/resources.zip", new File(outputDir, "resources"));
+
+        // generate html site
+        begin = System.currentTimeMillis();
+        int renderCount = renderHtml(sectionManager, outputDir);
+        System.out.println("Rendered " + renderCount + " html reports in " + (System.currentTimeMillis() - begin) / 1000 + " sec");
+
+        // generate summary reports
+        begin = System.currentTimeMillis();
+        renderCount = renderSummary(sectionManager, new File(outputDir, "reports"));
+        System.out.println("Rendered " + renderCount + " summary reports in " + (System.currentTimeMillis() - begin) / 1000 + " sec");
+    }
+
+    private int renderHtml(SectionManager sectionManager, File outputDir) throws Exception {
+        VelocityEngine velocity = new VelocityEngine();
+        velocity.setProperty(Velocity.RESOURCE_LOADER, "class");
+        velocity.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
+        velocity.setProperty(Velocity.VM_LIBRARY, "org/apache/geronimo/gbuild/report/macros.vm");
+        velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogSystem");
+
+        velocity.init();
+        Template summaryTemplate = velocity.getTemplate("org/apache/geronimo/gbuild/report/summary.vm");
+        Template testSuiteTemplate = velocity.getTemplate("org/apache/geronimo/gbuild/report/testsuite.vm");
+
+        // render the summary page
+        int renderCount = 0;
+        File summaryFile = new File(outputDir, "index.html");
+        if (!summaryFile.exists() || sectionManager.isNewResult() || forceHtml) {
+            renderVelocityTemplate("summary",
+                    sectionManager,
+                    summaryFile,
+                    summaryTemplate);
+            renderCount++;
+        }
+
+        File summaryDir = new File(outputDir, "summary");
+        summaryDir.mkdirs();
+
+        // render a page for each section
+        for (Iterator iterator = sectionManager.getSections().iterator(); iterator.hasNext();) {
+            Section section = (Section) iterator.next();
+            File sectionFile = new File(summaryDir, section.getName() + ".html");
+            if (!sectionFile.exists() || section.isNewResult() || forceHtml) {
+                renderVelocityTemplate("summary",
+                        section,
+                        sectionFile,
+                        summaryTemplate);
+                renderCount++;
+            }
+
+            File sectionDir = new File(summaryDir, section.getName());
+            sectionDir.mkdirs();
+
+            // render a page for each testsuite
+            for (Iterator iterator1 = section.getTestSuites().iterator(); iterator1.hasNext();) {
+                TestSuite testSuite = (TestSuite) iterator1.next();
+
+                File testSuiteFile = new File(sectionDir, testSuite.getName() + ".html");
+                if (!testSuiteFile.exists() || testSuite.isNewResult() || forceHtml) {
+                    renderVelocityTemplate("testSuite",
+                            testSuite,
+                            testSuiteFile,
+                            testSuiteTemplate);
+                    renderCount++;
+                }
+            }
+        }
+        return renderCount;
+    }
+
+    private static int renderSummary(SectionManager sectionManager, File outputDir) throws Exception {
+        int renderCount = 0;
+        if (!outputDir.isDirectory()) {
+            if (!outputDir.mkdirs()) {
+                throw new IOException("Could not create outputDir: " + outputDir.getAbsolutePath());
+            }
+        }
+
+        // render a summary for each section
+        for (Iterator iterator = sectionManager.getSections().iterator(); iterator.hasNext();) {
+            Section section = (Section) iterator.next();
+
+            // if the section is modified write a summary report
+            if (section.isNewResult()) {
+                SummaryReportUtil.saveTestCases(section.getTestCases(), new File(outputDir, section.getName() + ".properties"));
+                System.out.println("Updated summary report for section " + section.getName());
+                renderCount++;
+            }
+        }
+        return renderCount;
+    }
+
+    private void renderVelocityTemplate(String name, Object value, File outputFile, Template template) throws Exception {
+        ReportUtil.createDirectory(outputFile.getParentFile());
+
+        VelocityContext context = new VelocityContext();
+        context.put(name, value);
+
+        String reportDir = ReportUtil.relativePath(outputFile.getParentFile(), workDir);
+        context.put("reportDir", reportDir);
+
+        String rootDir = ReportUtil.relativePath(outputFile.getParentFile(), outputDir);
+        context.put("rootDir", rootDir);
+
+        PrintStream out = null;
+        FileReader templateReader = null;
+        try {
+            out = new PrintStream(new FileOutputStream(outputFile));
+            PrintWriter writer = new PrintWriter(out);
+            template.merge(context, writer);
+            writer.flush();
+        } finally {
+            ReportUtil.close(out);
+            ReportUtil.close(templateReader);
+        }
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/GenerateReport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/GenerateReport.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportFileLocator.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportFileLocator.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportFileLocator.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportFileLocator.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,40 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.io.File;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ReportFileLocator {
+    private final File workDir;
+
+    public ReportFileLocator(File workDir) {
+        this.workDir = workDir;
+    }
+
+    public String getReportFile(String className, String testName) {
+        if (workDir != null) {
+            String path = className.replace('.', '/') + '_' + testName + ".jtr";
+            if (new File(workDir, path).exists()) {
+                return path;
+            }
+        }
+        return null;
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportFileLocator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportFileLocator.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportUtil.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportUtil.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportUtil.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportUtil.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,247 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipEntry;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ReportUtil {
+    private ReportUtil() {
+    }
+
+    public static Properties loadProperties(File file) throws IOException {
+        Properties properties = new Properties();
+        if (!file.canRead()) {
+            return properties;
+        }
+
+        InputStream in = null;
+        try {
+            in = new FileInputStream(file);
+            properties.load(in);
+        } finally {
+            close(in);
+        }
+        return properties;
+    }
+
+    /**
+     * Write the specified map to the output file in java.util.Properties format.
+     *
+     * @param map        the data to write
+     * @param outputFile the file to which the data is written
+     * @throws IOException if a problem occurs wile writing the data
+     */
+    public static void saveProperties(final Map map, File outputFile) throws IOException {
+        createDirectory(outputFile.getParentFile());
+
+        OutputStream out = null;
+        try {
+            out = new FileOutputStream(outputFile);
+            Properties properties = new Properties() {
+                public Object get(Object key) {
+                    return map.get(key);
+                }
+
+                public synchronized Enumeration keys() {
+                    return Collections.enumeration(map.keySet());
+                }
+            };
+            properties.store(out, null);
+            out.flush();
+        } finally {
+            close(out);
+        }
+    }
+
+    public static void close(Reader thing) {
+        if (thing != null) {
+            try {
+                thing.close();
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
+    public static void close(InputStream thing) {
+        if (thing != null) {
+            try {
+                thing.close();
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
+    public static void close(OutputStream thing) {
+        if (thing != null && thing != System.out) {
+            try {
+                thing.close();
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
+    public static String formatTime(long milis) {
+        long hours = milis / (60 * 60 * 1000);
+        milis = milis % (60 * 60 * 1000);
+
+        long min = milis / (60 * 1000);
+        milis = milis % (60 * 1000);
+
+        long sec = milis / (1000);
+        milis = milis % (1000);
+
+        return (hours < 10 ? "0" : "") + hours + ":" +
+                (min < 10 ? "0" : "") + min + ":" +
+                (sec < 10 ? "0" : "") + sec;
+    }
+
+    public static SortedSet mergeTestCases(SortedSet one, SortedSet two) {
+        Map testCases = new HashMap();
+        for (Iterator iterator = one.iterator(); iterator.hasNext();) {
+            TestCase testCase = (TestCase) iterator.next();
+            testCases.put(testCase.getUniqueId(), testCase);
+        }
+        for (Iterator iterator = two.iterator(); iterator.hasNext();) {
+            TestCase testCase = (TestCase) iterator.next();
+            TestCase exising = (TestCase) testCases.get(testCase.getUniqueId());
+            if (exising == null) {
+                testCases.put(testCase, testCase);
+            } else {
+                boolean different = exising.isPassed() != testCase.isPassed() ||
+                        exising.isFailed() != testCase.isFailed() ||
+                        exising.isError() != testCase.isError();
+                if (different && !exising.isNewResult() && testCase.isNewResult()) {
+                    // results are different so make sure the test case we keep is the new result
+                    testCases.put(testCase.getUniqueId(), testCase);
+                } else if (!different && exising.isNewResult() && !testCase.isNewResult()) {
+                    // results are not different so make sure the test case we keep is the old result
+                    // this prevents unnecessary updaing
+                    testCases.put(testCase.getUniqueId(), testCase);
+                }
+            }
+        }
+        return new TreeSet(testCases.values());
+    }
+
+    public static String relativePath(File sourceDir, File targetFile) {
+        File normalizedTarget = normalizeFile(targetFile);
+        File normalizedSource = normalizeFile(sourceDir);
+        if (normalizedSource.equals(normalizedTarget)) {
+            return ".";
+        }
+
+        List targetFileList = new ArrayList();
+        for (File f = normalizedTarget; f != null; f = f.getParentFile()) {
+            targetFileList.add(f);
+        }
+        Collections.reverse(targetFileList);
+
+        StringBuffer path = new StringBuffer();
+        for (File f = normalizedSource; f != null && f.getParentFile() != null; f = f.getParentFile()) {
+            if (!targetFileList.contains(f)) {
+                if (path.length() > 0) path.append("/");
+                path.append("..");
+            } else {
+                int i = targetFileList.indexOf(f) + 1;
+                for (; i < targetFileList.size(); i++) {
+                    File file = (File) targetFileList.get(i);
+                    if (path.length() > 0) path.append("/");
+                    path.append(file.getName());
+                }
+                return path.toString();
+            }
+        }
+
+        return targetFile.getAbsolutePath();
+    }
+
+    public static File normalizeFile(File targetFile) {
+        return new File(targetFile.getAbsoluteFile().toURI().normalize()).getAbsoluteFile();
+    }
+
+    public static void createDirectory(File dir) throws IOException {
+        if (!dir.exists()) {
+            if (!dir.mkdirs()) {
+                throw new IOException("Could not create directory: \"" + dir.getAbsolutePath() + "\"");
+            }
+        }
+        if (!dir.isDirectory()) {
+            throw new IOException("Directory is not a directory: \"" + dir.getAbsolutePath() + "\"");
+        }
+    }
+
+    public static void unpackEmbeddedZip(String jarName, File outputDir) throws IOException {
+        InputStream in = null;
+        try {
+            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+            if (classLoader == null) classLoader = ReportUtil.class.getClassLoader();
+            in = classLoader.getResourceAsStream(jarName);
+            ZipInputStream zipInputStream = new ZipInputStream(in);
+            unpackZip(zipInputStream, outputDir);
+        } finally {
+            close(in);
+        }
+    }
+
+    public static void unpackZip(ZipInputStream zipInputStream, File outputDir) throws IOException{
+        for (ZipEntry zipEntry = zipInputStream.getNextEntry(); zipEntry != null; zipEntry = zipInputStream.getNextEntry()) {
+            File file = new File(outputDir, zipEntry.getName());
+            if (zipEntry.isDirectory()) {
+                createDirectory(file);
+            } else {
+                createDirectory(file.getParentFile());
+                OutputStream out = null;
+                try {
+                    out = new FileOutputStream(file);
+                    writeAll(zipInputStream, out);
+                } finally {
+                    close(out);
+                }
+            }
+        }
+    }
+
+    private static void writeAll(InputStream in, OutputStream out) throws IOException {
+        byte[] buffer = new byte[4096];
+        int count;
+        while ((count = in.read(buffer)) > 0) {
+            out.write(buffer, 0, count);
+        }
+        out.flush();
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/ReportUtil.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/Section.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/Section.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/Section.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/Section.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,149 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class Section {
+    private final String name;
+    private final SortedSet testCases;
+    private final SortedMap testSuites;
+    private final long errorCount;
+    private final long failureCount;
+    private final long totalTime;
+    private final boolean newResult;
+
+    public Section(String name, SortedSet testCases) {
+        if (name == null) throw new NullPointerException("name is null");
+        if (testCases == null) throw new NullPointerException("testCases is null");
+        this.name = name;
+        this.testCases = testCases;
+
+        // sort the test cases by class name keeping a running count
+        long errorCount = 0;
+        long failureCount = 0;
+        long totalTime = 0;
+        boolean newResult = false;
+        Map testCasesByClass = new TreeMap();
+        for (Iterator iterator = testCases.iterator(); iterator.hasNext();) {
+            TestCase testCase = (TestCase) iterator.next();
+            String className = testCase.getClassName();
+            TreeSet suiteTestCases = (TreeSet) testCasesByClass.get(className);
+            if (suiteTestCases == null) {
+                suiteTestCases = new TreeSet();
+                testCasesByClass.put(className, suiteTestCases);
+            }
+
+            if (testCase.isFailed()) {
+                failureCount++;
+            } else if (testCase.isError()) {
+                errorCount++;
+            }
+            totalTime += testCase.getTime();
+            newResult = newResult || testCase.isNewResult();
+            suiteTestCases.add(testCase);
+        }
+        this.errorCount = errorCount;
+        this.failureCount = failureCount;
+        this.totalTime = totalTime;
+        this.newResult = newResult;
+
+        SortedMap testSuites = new TreeMap();
+        for (Iterator iterator = testCasesByClass.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            String className = (String) entry.getKey();
+            Set suiteTestCases = (Set) entry.getValue();
+            TestSuite testSuite = new TestSuite(className, suiteTestCases);
+            testSuites.put(testSuite.getName(), testSuite);
+        }
+        this.testSuites = Collections.unmodifiableSortedMap(testSuites);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public SortedSet getTestCases() {
+        return testCases;
+    }
+
+    public Collection getTestSuites() {
+        return testSuites.values();
+    }
+
+    public Collection getItems() {
+        return testSuites.values();
+    }
+
+    public long getTestCount() {
+        return testCases.size();
+    }
+
+    public long getPassCount() {
+        return testCases.size() - errorCount - failureCount;
+    }
+
+    public long getErrorCount() {
+        return errorCount;
+    }
+
+    public long getFailureCount() {
+        return failureCount;
+    }
+
+    public long getTotalTime() {
+        return totalTime;
+    }
+
+    public String getTotalTimeString() {
+        return ReportUtil.formatTime(getTotalTime());
+    }
+
+    public boolean isPassed() {
+        return testCases.size() > 0 && failureCount == 0 && errorCount == 0;
+    }
+
+    public int getPassPercentage() {
+        if (testCases.isEmpty()) {
+            return 0;
+        }
+        return (int) ((0.0 + getPassCount()) * 100 / testCases.size());
+    }
+
+    public int getPassBarSize() {
+        return getPassPercentage() * 2;
+    }
+
+    public int getFailBarSize() {
+        return 200 - getPassBarSize();
+    }
+
+    public boolean isNewResult() {
+        return newResult;
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/Section.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/Section.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SectionManager.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SectionManager.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SectionManager.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SectionManager.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,169 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class SectionManager {
+    private final SortedSet testCases;
+    private final Map sections;
+    private final long errorCount;
+    private final long failureCount;
+    private final long totalTime;
+    private final boolean newResult;
+
+    public SectionManager(Map namedSections, SortedSet testCases) {
+        this.testCases = testCases;
+
+        // initialize the section set
+        Map sectionsByPackage = new TreeMap();
+        Map sectionSets = new TreeMap();
+        for (Iterator iterator = namedSections.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            String sectionName = (String) entry.getKey();
+            String sectionPackage = (String) entry.getValue();
+            sectionSets.put(sectionPackage, new TreeSet());
+            sectionsByPackage.put(sectionPackage, sectionName);
+        }
+
+        // sort the test cases by section keeping a running count
+        long errorCount = 0;
+        long failureCount = 0;
+        long totalTime = 0;
+        boolean newResult = false;
+        for (Iterator iterator = testCases.iterator(); iterator.hasNext();) {
+            TestCase testCase = (TestCase) iterator.next();
+
+            Set sectionTestCases = getSectionTestCases(testCase.getClassName(), sectionSets);
+            sectionTestCases.add(testCase);
+
+            if (testCase.isFailed()) {
+                failureCount++;
+            } else if (testCase.isError()) {
+                errorCount++;
+            }
+            totalTime += testCase.getTime();
+            newResult = newResult || testCase.isNewResult();
+        }
+        this.errorCount = errorCount;
+        this.failureCount = failureCount;
+        this.totalTime = totalTime;
+        this.newResult = newResult;
+
+        // build the section objects
+        SortedMap sections = new TreeMap();
+        for (Iterator iterator = sectionSets.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            String sectionPackage = (String) entry.getKey();
+            SortedSet sectionTestCases = (SortedSet) entry.getValue();
+            String sectionName = (String) sectionsByPackage.get(sectionPackage);
+            if (sectionName == null) sectionName = "other";
+            Section section = new Section(sectionName, sectionTestCases);
+            sections.put(section.getName(), section);
+        }
+        this.sections = Collections.unmodifiableSortedMap(sections);
+    }
+
+
+    private Set getSectionTestCases(String testCaseClass, Map sections) {
+        for (Iterator sectionIterator = sections.entrySet().iterator(); sectionIterator.hasNext();) {
+            Map.Entry sectionEntry = (Map.Entry) sectionIterator.next();
+            String sectionPackage = (String) sectionEntry.getKey();
+            sectionPackage += ".";
+            Set sectionSet = (Set) sectionEntry.getValue();
+            if (testCaseClass.startsWith(sectionPackage)) {
+                return sectionSet;
+            }
+        }
+        Set otherSet = (Set) sections.get("other");
+        if (otherSet == null) {
+            otherSet = new TreeSet();
+            sections.put("other", otherSet);
+        }
+        return otherSet;
+    }
+
+    public String getName() {
+        return "summary";
+    }
+
+    public Collection getSections() {
+        return sections.values();
+    }
+
+    public Collection getItems() {
+        return sections.values();
+    }
+
+    public long getPassCount() {
+        return testCases.size() - errorCount - failureCount;
+    }
+
+    public long getErrorCount() {
+        return errorCount;
+    }
+
+    public long getFailureCount() {
+        return failureCount;
+    }
+
+    public long getTestCount() {
+        return testCases.size();
+    }
+
+    public long getTotalTime() {
+        return totalTime;
+    }
+
+    public String getTotalTimeString() {
+        return ReportUtil.formatTime(getTotalTime());
+    }
+
+    public boolean isPassed() {
+        return testCases.size() > 0 && failureCount == 0 && errorCount == 0;
+    }
+
+    public int getPassPercentage() {
+        if (testCases.isEmpty()) {
+            return 0;
+        }
+        return (int) ((0.0 + getPassCount()) * 100 / testCases.size());
+    }
+
+    public int getPassBarSize() {
+        return getPassPercentage() * 2;
+    }
+
+    public int getFailBarSize() {
+        return 200 - getPassBarSize();
+    }
+
+    public boolean isNewResult() {
+        return newResult;
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SectionManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SectionManager.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportLoader.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportLoader.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportLoader.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportLoader.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,62 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class SummaryReportLoader {
+    private final Set reportFiles;
+    private final boolean newResult;
+    private final ReportFileLocator reportFileLocator;
+
+    public SummaryReportLoader(Set reportFiles, boolean newResult, ReportFileLocator reportFileLocator) {
+        this.reportFiles = reportFiles;
+        this.newResult = newResult;
+        this.reportFileLocator = reportFileLocator;
+    }
+
+    public SummaryReportLoader(File reportsDir, boolean newResult, ReportFileLocator reportFileLocator) {
+        reportFiles = new HashSet();
+        File[] files = reportsDir.listFiles();
+        for (int i = 0; i < files.length; i++) {
+            File file = files[i];
+            if (file.canRead() && file.getName().endsWith(".properties")) {
+                reportFiles.add(file);
+            }
+        }
+        this.newResult = newResult;
+        this.reportFileLocator = reportFileLocator;
+    }
+
+    public SortedSet loadTestCases() throws Exception {
+        SortedSet testcases = new TreeSet();
+        for (Iterator iterator = reportFiles.iterator(); iterator.hasNext();) {
+            File reportFile = (File) iterator.next();
+            Set cases = SummaryReportUtil.loadTestCases(reportFile, newResult, reportFileLocator);
+            testcases.addAll(cases);
+        }
+        return testcases;
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportLoader.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportUtil.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportUtil.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportUtil.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportUtil.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,104 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class SummaryReportUtil {
+    private SummaryReportUtil() {
+    }
+
+    public static Set loadTestCases(File reportFile, boolean newResult, ReportFileLocator reportFileLocator) throws IOException {
+        Set testcases = new HashSet();
+        Properties properties = ReportUtil.loadProperties(reportFile);
+        for (Iterator caseIterator = properties.entrySet().iterator(); caseIterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) caseIterator.next();
+            String storeName = (String) entry.getKey();
+            String storeValue = (String) entry.getValue();
+            TestCase testCase = createTestcase(storeName, storeValue, newResult, reportFileLocator);
+            testcases.add(testCase);
+        }
+        return testcases;
+    }
+
+    public static void saveTestCases(Set testCases, File outputFile) throws IOException {
+        Map summary = new TreeMap();
+        for (Iterator iterator = testCases.iterator(); iterator.hasNext();) {
+            TestCase testCase = (TestCase) iterator.next();
+            summary.put(getStoreName(testCase), getStoreValue(testCase));
+        }
+        ReportUtil.saveProperties(summary, outputFile);
+    }
+
+    private static TestCase createTestcase(String storeName, String storeValue, boolean newResult, ReportFileLocator reportFileLocator) {
+        int index = storeName.lastIndexOf('#');
+        String name = storeName.substring(index + 1);
+        String classname = storeName.substring(0, index);
+        String reportFile = reportFileLocator.getReportFile(classname, name);
+
+        char flag = storeValue.charAt(0);
+        index = storeValue.indexOf(')');
+        long time = Long.parseLong(storeValue.substring(3, index));
+        boolean failed;
+        boolean error;
+        String msg;
+        if (flag == 'P') {
+            failed = false;
+            error = false;
+            msg = "";
+        } else {
+            if (flag == 'F') {
+                failed = true;
+                error = false;
+            } else {
+                failed = false;
+                error = true;
+            }
+            if (storeValue.length() >= index + 2) {
+                msg = storeValue.substring(index + 2);
+            } else {
+                msg = "";
+            }
+        }
+
+        return new TestCase(name, classname, reportFile, time, failed, error, msg, newResult);
+    }
+
+    private static String getStoreName(TestCase testCase) {
+        return testCase.getClassName() + "#" + testCase.getName();
+    }
+
+    private static String getStoreValue(TestCase testCase) {
+        if (testCase.isPassed()) {
+            return "P (" + testCase.getTime() + ")";
+        } else if (testCase.isFailed()) {
+            return "F (" + testCase.getTime() + ") " + testCase.getMsg();
+        } else {
+            return "F (" + testCase.getTime() + ") " + testCase.getMsg();
+        }
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/SummaryReportUtil.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestCase.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestCase.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestCase.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestCase.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,116 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+
+
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TestCase implements Comparable {
+    private final String name;
+    private final String className;
+    private final String reportFile;
+    private final long time;
+    private final boolean failed;
+    private final boolean error;
+    private final String msg;
+    private final boolean newResult;
+
+    public TestCase(String name, String className, String reportFile, long time, boolean failed, boolean error, String msg, boolean newResult) {
+        this.name = name;
+        this.className = className;
+        this.reportFile = reportFile;
+        this.time = time;
+        this.failed = failed;
+        this.error = error;
+        this.msg = msg;
+        this.newResult = newResult;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public String getUniqueId() {
+        return className + '#' + name;
+    }
+
+    public String getReportFile() {
+        return reportFile;
+    }
+
+    public long getTime() {
+        return time;
+    }
+
+    public String getTimeString() {
+        return ReportUtil.formatTime(getTime());
+    }
+
+    public boolean isPassed() {
+        return !failed && !error;
+    }
+
+    public boolean isFailed() {
+        return failed;
+    }
+
+    public boolean isError() {
+        return error;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public boolean isNewResult() {
+        return newResult;
+    }
+
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof TestCase) {
+            TestCase testCase = (TestCase) obj;
+            return className.equals(testCase.className) && name.equals(testCase.name);
+        }
+        return false;
+    }
+
+    public int hashCode() {
+        int hash = 7;
+        hash = 31 * hash + className.hashCode();
+        hash = 31 * hash + name.hashCode();
+        return hash;
+    }
+
+    public int compareTo(Object obj) {
+        TestCase testCase = (TestCase) obj;
+        int i = className.compareTo(testCase.className);
+        if (i != 0) {
+            return i;
+        }
+        return name.compareTo(testCase.name);
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestCase.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestSuite.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestSuite.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestSuite.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestSuite.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,126 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class TestSuite {
+    private final String name;
+    private final SortedMap testCases;
+    private final long errorCount;
+    private final long failureCount;
+    private final long totalTime;
+    private final boolean newResult;
+
+    public TestSuite(String name, Set testCases) {
+        this.name = name;
+
+        long errorCount = 0;
+        long failureCount = 0;
+        long totalTime = 0;
+        boolean newResult = false;
+        SortedMap testCasesByName = new TreeMap();
+        for (Iterator iterator = testCases.iterator(); iterator.hasNext();) {
+            TestCase testCase = (TestCase) iterator.next();
+            if (testCase.isFailed()) {
+                failureCount++;
+            } else if (testCase.isError()) {
+                errorCount++;
+            }
+            totalTime += testCase.getTime();
+            newResult = newResult || testCase.isNewResult();
+            testCasesByName.put(testCase.getName(), testCase);
+        }
+        this.errorCount = errorCount;
+        this.failureCount = failureCount;
+        this.totalTime = totalTime;
+        this.newResult = newResult;
+
+        this.testCases = Collections.unmodifiableSortedMap(testCasesByName);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public TestCase getTestCase(String name) {
+        return (TestCase) testCases.get(name);
+    }
+
+    public Collection getTestCases() {
+        return testCases.values();
+    }
+
+    public Collection getItems() {
+        return testCases.values();
+    }
+
+    public long getTestCount() {
+        return testCases.size();
+    }
+
+    public long getPassCount() {
+        return testCases.size() - errorCount - failureCount;
+    }
+
+    public long getErrorCount() {
+        return errorCount;
+    }
+
+    public long getFailureCount() {
+        return failureCount;
+    }
+
+    public long getTotalTime() {
+        return totalTime;
+    }
+
+    public String getTotalTimeString() {
+        return ReportUtil.formatTime(getTotalTime());
+    }
+
+    public boolean isPassed() {
+        return getTestCount() > 0 && failureCount == 0 && errorCount == 0;
+    }
+
+    public int getPassPercentage() {
+        if (testCases.isEmpty()) {
+            return 0;
+        }
+        return (int) ((0.0 + getPassCount()) * 100 / testCases.size());
+    }
+
+    public int getPassBarSize() {
+        return getPassPercentage() * 2;
+    }
+
+    public int getFailBarSize() {
+        return 200 - getPassBarSize();
+    }
+
+    public boolean isNewResult() {
+        return newResult;
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestSuite.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/TestSuite.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/WorkDirLoader.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/WorkDirLoader.java?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/WorkDirLoader.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/WorkDirLoader.java Tue Nov  8 13:57:27 2005
@@ -0,0 +1,156 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.report;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class WorkDirLoader {
+    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy");
+    private static final String LOG_START = "#section";
+
+    private final File workDir;
+    private final boolean newResult;
+    private final ReportFileLocator reportFileLocator;
+
+    public WorkDirLoader(File workDir, boolean newResult, ReportFileLocator reportFileLocator) {
+        this.workDir = workDir;
+        this.newResult = newResult;
+        this.reportFileLocator = reportFileLocator;
+    }
+
+    public SortedSet loadTestCases() throws Exception {
+        SortedSet testcases = new TreeSet();
+        LinkedList resultFiles = new LinkedList();
+        findResultFiles(workDir, resultFiles);
+        for (Iterator iterator = resultFiles.iterator(); iterator.hasNext();) {
+            File resultsFile = (File) iterator.next();
+            TestCase testCase = createTestcase(resultsFile, workDir);
+            testcases.add(testCase);
+        }
+        return testcases;
+    }
+
+    public TestCase createTestcase(File resultsFile, File workDir) throws IOException {
+        Properties properties = loadResultsProperties(resultsFile);
+        String name = properties.getProperty("id");
+
+        String classname;
+        String path = workDir.toURI().relativize(resultsFile.toURI()).getPath();
+        if (!path.endsWith("_" + name + ".jtr")) {
+            System.err.println("Path should end with " + name + ".jtr - " + path);
+            classname = properties.getProperty("classname");
+        } else {
+            String classPart = path.substring(0, path.length() - name.length() - 5);
+            classname = classPart.replace('/', '.');
+        }
+
+        String reportFile = reportFileLocator.getReportFile(classname, name);
+
+        boolean failed;
+        boolean error;
+        String msg;
+        String execStatus = properties.getProperty("execStatus");
+        if (execStatus.startsWith("Passed.")) {
+            failed = false;
+            error = false;
+            msg = "";
+        } else if (execStatus.startsWith("Failed.")) {
+            failed = true;
+            error = false;
+            msg = execStatus.substring(7).trim();
+        } else if (execStatus.startsWith("Error.")) {
+            failed = true;
+            error = false;
+            msg = execStatus.substring(6).trim();
+        } else {
+            failed = false;
+            error = true;
+            msg = execStatus;
+        }
+
+        long t = 0;
+        try {
+            long start = DATE_FORMAT.parse(properties.getProperty(("start"))).getTime();
+            long end = DATE_FORMAT.parse(properties.getProperty(("end"))).getTime();
+            t = end - start;
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+        long time = t;
+        return new TestCase(name, classname, reportFile, time, failed, error, msg, newResult);
+    }
+
+    private static void findResultFiles(File dir, Collection resultsFiles) {
+        File[] files = dir.listFiles();
+        if (null == files) {
+            return;
+        }
+        for (int i = 0; i < files.length; i++) {
+            if (files[i].isDirectory()) {
+                findResultFiles(files[i], resultsFiles);
+            } else if (files[i].getName().endsWith(".jtr")) {
+                resultsFiles.add(files[i]);
+            }
+        }
+    }
+
+    private static Properties loadResultsProperties(File resultsFile) throws IOException {
+        FileReader in = null;
+        Properties properties = new Properties();
+        try {
+            // we're going to read in line at a time
+            in = new FileReader(resultsFile);
+            LineNumberReader lineReader = new LineNumberReader(in);
+
+            // and write to a string buffer
+            StringWriter stringWriter = new StringWriter();
+            PrintWriter out = new PrintWriter(stringWriter);
+
+            // read until the log start
+            String line;
+            while ((line = lineReader.readLine()) != null) {
+                if (line.startsWith(LOG_START)) {
+                    break;
+                }
+                out.println(line);
+            }
+
+            // now load the properties
+            properties.load(new ByteArrayInputStream(stringWriter.toString().getBytes()));
+        } finally {
+            ReportUtil.close(in);
+        }
+        return properties;
+    }
+}

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/WorkDirLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/report/WorkDirLoader.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/gbuild/trunk/src/main/report-resources/h3.gif
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/h3.gif?rev=331903&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/gbuild/trunk/src/main/report-resources/h3.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: geronimo/gbuild/trunk/src/main/report-resources/icon_error_sml.gif
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/icon_error_sml.gif?rev=331903&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/gbuild/trunk/src/main/report-resources/icon_error_sml.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: geronimo/gbuild/trunk/src/main/report-resources/icon_info_sml.gif
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/icon_info_sml.gif?rev=331903&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/gbuild/trunk/src/main/report-resources/icon_info_sml.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: geronimo/gbuild/trunk/src/main/report-resources/icon_success_sml.gif
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/icon_success_sml.gif?rev=331903&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/gbuild/trunk/src/main/report-resources/icon_success_sml.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: geronimo/gbuild/trunk/src/main/report-resources/icon_warning_sml.gif
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/icon_warning_sml.gif?rev=331903&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/gbuild/trunk/src/main/report-resources/icon_warning_sml.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: geronimo/gbuild/trunk/src/main/report-resources/maven-base.css
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/maven-base.css?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/report-resources/maven-base.css (added)
+++ geronimo/gbuild/trunk/src/main/report-resources/maven-base.css Tue Nov  8 13:57:27 2005
@@ -0,0 +1,156 @@
+body {
+  margin: 0px;
+  padding: 0px;
+}
+img {
+  border:none;
+}
+table {
+  padding:0px;
+  width: 100%;
+  margin-left: -2px;
+  margin-right: -2px;
+}
+acronym {
+  cursor: help;
+  border-bottom: 1px dotted #feb;
+}
+table.bodyTable th, table.bodyTable td {
+  padding: 2px 4px 2px 4px;
+  vertical-align: top;
+}
+div.clear{
+  clear:both;
+  visibility: hidden;
+}
+div.clear hr{
+  display: none;
+}
+#organizationLogo, #projectLogo {
+  font-size: xx-large; 
+  font-weight: bold;
+}
+#organizationLogo img, #projectLogo img, #organizationLogo span, #projectLogo span{
+  margin: 0px;
+}
+#organizationLogo span, #projectLogo span{
+    border: 1px solid;
+    padding: 4px 10px 4px 10px;
+    background-color: #eee;
+    cursor: pointer;
+}
+.xleft, #organizationLogo img{
+  float:left;
+} 
+.xright, #projectLogo img, #projectLogo span{
+  float:right;
+  text-shadow: #7CFC00;
+}
+#banner {
+  padding: 0px;
+}
+#banner img {
+  border: none;
+}
+#breadcrumbs {
+  padding: 3px 10px 3px 10px;
+}
+#leftColumn {
+ width: 150px;
+ float:left;
+}
+#bodyColumn {
+  margin-right: 1.5em;
+  margin-left: 177px;
+}
+#legend {
+  padding: 8px 0 8px 0;
+}
+#navcolumn {
+  padding: 8px 4px 0 8px;
+}
+#navcolumn h5 {
+  margin: 0;
+  padding: 0;
+  font-size: small;
+}
+#navcolumn ul {
+  margin: 0;
+  padding: 0;
+  font-size: small;
+}
+#navcolumn li {
+  list-style-type: none;
+  background-image: none;
+  background-repeat: no-repeat;
+  background-position: 0 0.4em;
+  padding-left: 16px;
+  list-style-position: outside;
+  line-height: 1.2em;
+  font-size: smaller;
+}
+#navcolumn li.expanded {
+  background-image: url(../images/expanded.gif);
+}
+#navcolumn li.collapsed {
+  background-image: url(../images/collapsed.gif);
+}
+#poweredBy, #poweredByExternal {
+  text-align: center;
+}
+#navcolumn img {
+  margin-top: 10px;
+  margin-bottom: 3px;
+}
+#poweredBy img {
+  display:block;
+  margin: 20px 0 20px 17px;
+  border: 1px solid black;
+  width: 90px;
+  height: 30px;
+}
+#poweredByExternal img {
+  display:block;
+  margin: 20px 0 20px 17px;
+}
+#searchbar img {
+    margin: 0px;
+    display: block;
+}
+#searchbar #q, #searchbar #btnG {
+    border: 1px solid #999;
+    margin-bottom:10px;
+}
+#searchbar form {
+    margin: 0px;
+}
+#lastPublished {
+  font-size: x-small;
+}
+.navSection {
+  margin-bottom: 2px;
+  padding: 8px;
+}
+.navSectionHead {
+  font-weight: bold;
+  font-size: x-small;
+}
+.section {
+  padding: 4px;
+}
+#footer {
+  padding: 3px 10px 3px 10px;
+  font-size: x-small;
+}
+#breadcrumbs {
+  font-size: x-small;
+  margin: 0pt;
+}
+.source {
+  padding: 12px;
+  margin: 1em 7px 1em 7px;
+}
+.source pre {
+  margin: 0px;
+  padding: 0px;
+}

Added: geronimo/gbuild/trunk/src/main/report-resources/maven-stylus.css
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/maven-stylus.css?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/report-resources/maven-stylus.css (added)
+++ geronimo/gbuild/trunk/src/main/report-resources/maven-stylus.css Tue Nov  8 13:57:27 2005
@@ -0,0 +1,197 @@
+TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
+TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
+TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
+
+TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
+TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }
+
+body {
+        background-color: #fff;
+	font-family: Verdana, Helvetica, Arial, sans-serif;
+	margin-left: auto;
+	margin-right: auto;
+	background-repeat: repeat-y;
+	font-size: 13px;
+	padding: 0px;
+}
+td, select, input, li{
+	font-family: Verdana, Helvetica, Arial, sans-serif;
+	font-size: 12px;
+	color:#333333;
+}
+code{
+  font-size: 12px;
+}
+a {
+  text-decoration: none;
+}
+a:link {
+  color:#47a;
+}
+a:visited  {
+  color:#666666;
+}
+a:active, a:hover {
+  color:#990000;
+}
+#legend li.externalLink {
+  background: url(../images/external.png) left top no-repeat;
+  padding-left: 18px;
+}
+a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
+  background: url(../images/external.png) right center no-repeat;
+  padding-right: 18px;
+}
+#breadcrumbs a.externalLink, #breadcrumbs a.externalLink:link, #breadcrumbs a.externalLink:visited, #breadcrumbs a.externalLink:active, #breadcrumbs a.externalLink:hover {
+  background: none;
+  padding-right: 0px;
+}
+#legend li.newWindow {
+  background: url(../images/newwindow.png) left top no-repeat;
+  padding-left: 18px;
+}
+a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
+  background: url(../images/newwindow.png) right center no-repeat;
+  padding-right: 18px;
+}
+#breadcrumbs a.newWindow, #breadcrumbs a.newWindow:link, #breadcrumbs a.newWindow:visited, #breadcrumbs a.newWindow:active, #breadcrumbs a.newWindow:hover {
+  background: none;
+  padding-right: 0px;
+}
+h2 {
+	font-size: 17px;
+	color: #333333;  
+}
+h3 {
+	padding: 4px 4px 4px 24px;
+	color: #666;
+	background-color: #ccc;
+	font-weight: bold;
+	font-size: 14px;
+	background-image: url(../images/h3.gif);
+	background-repeat: no-repeat;
+	background-position: left bottom;
+}
+p {
+  line-height: 1.3em;
+  font-size: 12px;
+  color: #000;
+}
+#breadcrumbs {
+	height: 13px;
+	background-image: url(../images/breadcrumbs.jpg);
+	padding: 5px 10px 14px 20px;
+}
+* html #breadcrumbs {
+	padding-bottom: 8px;
+}
+#leftColumn {
+	margin: 10px 0 10px 0;
+	border-top-color: #ccc;
+	border-top-style: solid;
+	border-top-width: 1px;
+	border-right-color: #ccc;
+	border-right-style: solid;
+	border-right-width: 1px;
+	border-bottom-color: #ccc;
+	border-bottom-style: solid;
+	border-bottom-width: 1px;
+	padding-right: 5px;
+	padding-left: 5px;
+}
+#navcolumn h5 {
+	font-size: smaller;
+	border-bottom: 1px solid #aaaaaa;
+	padding-top: 2px;
+	padding-left: 9px;
+	color: #49635a;
+	background-image: url(../images/h5.jpg);
+	background-repeat: no-repeat;
+	background-position: left bottom;
+}
+
+table.bodyTable th {
+  color: white;
+  background-color: #bbb;
+  text-align: left;
+  font-weight: bold;
+}
+
+table.bodyTable th, table.bodyTable td {
+  font-size: 11px;
+}
+
+table.bodyTable tr.a {
+  background-color: #ddd;
+}
+
+table.bodyTable tr.b {
+  background-color: #eee;
+}
+
+.source {
+  border: 1px solid #999;
+  overflow:auto
+}
+dt {
+	padding: 4px 4px 4px 24px;
+	color: #333333;
+	background-color: #ccc;
+	font-weight: bold;
+	font-size: 14px;
+	background-image: url(../images/h3.gif);
+	background-repeat: no-repeat;
+	background-position: left bottom;
+}
+.subsectionTitle {
+	font-size: 13px;
+	font-weight: bold;
+	color: #666;
+
+}
+
+table {
+	font-size: 10px;
+}
+.xright a:link, .xright a:visited, .xright a:active {
+  color: #666;
+}
+.xright a:hover {
+  color: #003300;
+}
+#banner {
+	height: 93px;
+	background: url(../images/banner.jpg);
+}
+#navcolumn ul {
+	margin: 5px 0 15px -0em;
+}
+#navcolumn ul a {
+	color: #333333;
+}
+#navcolumn ul a:hover {
+	color: red;
+}
+#intro {
+	border: solid #ccc 1px;
+	margin: 6px 0px 0px 0px;
+	padding: 10px 40px 10px 40px;
+}
+.subsection {
+	margin-left: 3px;
+	color: #333333;
+}
+
+.subsection p {
+	font-size: 12px;
+}
+#footer {
+  padding: 10px;
+  margin: 20px 0px 20px 0px;
+  border-top: solid #ccc 1px; 
+  color: #333333;
+}
+#organizationLogo img, #projectLogo img, #projectLogo span{
+  margin: 0px;
+}
+

Added: geronimo/gbuild/trunk/src/main/report-resources/print.css
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/print.css?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/report-resources/print.css (added)
+++ geronimo/gbuild/trunk/src/main/report-resources/print.css Tue Nov  8 13:57:27 2005
@@ -0,0 +1,7 @@
+#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks, #leftColumn, #navColumn {
+  display: none;
+}
+#bodyColumn, body.docs div.docs {
+  margin: 0 !important;
+  border: none !important
+}

Added: geronimo/gbuild/trunk/src/main/report-resources/spacer.gif
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/report-resources/spacer.gif?rev=331903&view=auto
==============================================================================
Binary file - no diff available.

Propchange: geronimo/gbuild/trunk/src/main/report-resources/spacer.gif
------------------------------------------------------------------------------
    svn:executable = *

Propchange: geronimo/gbuild/trunk/src/main/report-resources/spacer.gif
------------------------------------------------------------------------------
    svn:mime-type = image/gif

Added: geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/all-xml.vm
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/all-xml.vm?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/all-xml.vm (added)
+++ geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/all-xml.vm Tue Nov  8 13:57:27 2005
@@ -0,0 +1,19 @@
+<total time='$sectionManager.totalTimeString' tests='$sectionManager.testCount' errors='$sectionManager.errorCount' failures='$sectionManager.failureCount'>
+#foreach( $section in $sectionManager.sections )
+    <section name="$section.name" time='$section.totalTimeString' tests='$section.testCount' errors='$section.errorCount' failures='$section.failureCount'>
+#foreach( $testSuite in $section.testSuites )
+        <testsuite name='$testSuite.name'  time='$testSuite.totalTimeString' tests='$testSuite.testCount' errors='$testSuite.errorCount' failures='$testSuite.failureCount' >
+#foreach( $testCase in $testSuite.testcases )
+            <testCase name='$testCase.name' time='$testCase.time'>
+#if( $testCase.failed )
+                <failure message='$testCase.msg' type=''/>
+#elseif( $testCase.error )
+                <error message='$testCase.msg' type=''/>
+#end
+            </testCase>
+#end
+        </testsuite>
+#end
+    </section>
+#end
+</total>

Added: geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/macros.vm
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/macros.vm?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/macros.vm (added)
+++ geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/macros.vm Tue Nov  8 13:57:27 2005
@@ -0,0 +1,93 @@
+#macro( graph $rootDir $item )
+      <table width="200" height="15" cellpadding="0" cellspacing="0" border="0" class="estimateGraph">
+        <tr>
+          #if( $item.passBarSize > 0 )
+          <td class="greenbar"><img src="${rootDir}/resources/spacer.gif" border="0" width="$item.passBarSize" height="1"/></td>
+          #end
+          #if( $item.failBarSize > 0 )
+          <td class="darkredbar"><img src="${rootDir}/resources/spacer.gif" border="0" width="$item.failBarSize" height="1"/></td>
+          #end
+        </tr>
+      </table>
+#end
+
+#macro( testImage $rootDir $testCase )
+    #if( $testCase.passed )
+      #set( $image = "${rootDir}/resources/icon_success_sml.gif" )
+    #elseif( $testCase.failed )
+      #set( $image = "${rootDir}/resources/icon_warning_sml.gif" )
+    #else
+      #set( $image = "${rootDir}/resources/icon_error_sml.gif" )
+    #end
+#end
+
+#macro( setRowStyle )
+    #if( $rowStyle == "a" )
+      #set( $rowStyle = "b" )
+    #else
+      #set( $rowStyle = "a" )
+    #end
+#end
+
+#macro( summaryLine $rootDir $summary )
+      <table class="bodyTable">
+        <tr class="a">
+          <td>
+            Tests: $summary.testCount
+          </td>
+          <td>
+            Errors: $summary.errorCount
+          </td>
+          <td>
+            Failures: $summary.failureCount
+          </td>
+          <td align="center" width="30">${summary.passPercentage}%</td>
+          <td align="center" width="200">
+            #graph( $rootDir $summary )
+          </td>
+          <td>
+            Time: $summary.totalTimeString
+          </td>
+        </tr>
+      </table>
+#end
+
+#macro( resultTable $rootDir $summary )
+<table class="bodyTable">
+  <thead>
+    <tr>
+      <th>Class</th>
+      <th>Tests</th>
+      <th>Errors</th>
+      <th>Failures</th>
+      <th>Success Rate</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+#set( $rowStyle = "a" )
+#foreach( $item in $summary.items )
+  <tr class="$rowStyle">
+    <td>
+      <a href="${summary.name}/${item.name}.html">$item.name</a>
+    </td>
+    <td width="30">
+      $item.testCount
+    </td>
+    <td width="30">
+      $item.errorCount
+    </td>
+    <td width="30">
+      $item.failureCount
+    </td>
+    <td width="200">
+      #graph( $rootDir $item )
+    </td>
+    <td width="30">
+      $item.totalTimeString
+    </td>
+  </tr>
+#setRowStyle()
+#end
+</table>
+#end
+

Added: geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/summary.vm
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/summary.vm?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/summary.vm (added)
+++ geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/summary.vm Tue Nov  8 13:57:27 2005
@@ -0,0 +1,30 @@
+<html>
+  <head>
+    <title>Geronimo : $summary.name</title>
+
+    <style type="text/css" media="all">
+      @import url("${rootDir}/resources/maven-base.css");
+      @import url("${rootDir}/resources/maven-stylus.css");
+    </style>
+    <link rel="stylesheet" href="${rootDir}/resources/print.css" type="text/css" media="print"></link>
+    <META http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+  </head>
+
+  <body>
+    <div class="section">
+      <a name="$summary.name"></a>
+      <h2>Geronimo : $summary.name</h2>
+      #summaryLine( $rootDir $summary )
+    </div>
+
+    <div class="section">
+      #resultTable( $rootDir $summary )
+    </div>
+    <div class="section">
+      #summaryLine( $rootDir $summary )
+      <p>
+        * Note: Statistics are not computed recursively, they only sum up all of its testsuites numbers.
+      </p>
+    </div>
+  </body>
+</html>

Propchange: geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/summary.vm
------------------------------------------------------------------------------
    svn:mime-type = text/html

Added: geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/testsuite.vm
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/testsuite.vm?rev=331903&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/testsuite.vm (added)
+++ geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/testsuite.vm Tue Nov  8 13:57:27 2005
@@ -0,0 +1,48 @@
+<html>
+  <head>
+    <title>Geronimo : $testSuite.name</title>
+
+    <style type="text/css" media="all">
+      @import url("${rootDir}/resources/maven-base.css");
+      @import url("${rootDir}/resources/maven-stylus.css");
+    </style>
+    <link rel="stylesheet" href="${rootDir}/resources/print.css" type="text/css" media="print"></link>
+    <META http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+  </head>
+
+  <body>
+    <div class="section">
+      <a name="$summary.name"></a>
+      <h2>Geronimo : $testSuite.name</h2>
+      #summaryLine( $rootDir $testSuite )
+    </div>
+
+    <div class="section">
+      <table class="bodyTable">
+#set( $rowStyle = "a" )
+#foreach( $testCase in $testSuite.testCases )
+        <tr class="$rowStyle">
+          <td style="width:20px">
+            #testImage( $rootDir $testCase )
+            <img width="15" height="15" src="$image" alt="Success"></img>
+          </td>
+          <td style="width:98%">
+            #if ( ${testCase.reportFile} )
+            <a href="${reportDir}/${testCase.reportFile}">
+            #end
+            $testCase.name
+            #if ( ${testCase.reportFile} )
+            </a>
+            #end
+          <td style="width:60px">$testCase.timeString</td>
+        </tr>
+#setRowStyle()
+#end
+      </table>
+
+    </div>
+    <div class="section">
+      #summaryLine( $rootDir $testSuite )
+    </div>
+  </body>
+</html>

Propchange: geronimo/gbuild/trunk/src/main/resources/org/apache/geronimo/gbuild/report/testsuite.vm
------------------------------------------------------------------------------
    svn:mime-type = text/html