You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beehive.apache.org by ek...@apache.org on 2005/08/12 17:23:08 UTC

svn commit: r232310 [74/92] - in /beehive/trunk/controls/test: common/ infra/gtlf/ infra/gtlf/xsl/ infra/mantis/ infra/tch/ infra/tch/messages/ infra/tch/runtime/ infra/tch/schema/ perf/ perf/bin/ perf/cases/ perf/ctlsrc/org/apache/beehive/controls/per...

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/ExtensibleGTLFLogger.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/ExtensibleGTLFLogger.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/ExtensibleGTLFLogger.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/ExtensibleGTLFLogger.java Fri Aug 12 08:12:28 2005
@@ -1,37 +1,37 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.text.SimpleDateFormat;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-// import org.apache.beehive.test.tools.tch.util.TchUtils;
-// import org.apache.beehive.test.tools.tch.util.StringUtils;
-// import org.apache.beehive.test.tools.tch.util.TestResult;
-// import org.apache.beehive.test.tools.tch.util.gtlf.GTLFConstants;
-// import org.apache.beehive.test.tools.tch.util.gtlf.GTLFResultStripper;
-// import org.apache.beehive.test.tools.tch.util.gtlf.GTLFTestResultAdapter;
-// import org.apache.beehive.test.tools.tch.util.xml.XMLUtil;
-
-import org.apache.beehive.test.tools.tch.util.gtlf.GTLFProperties;
-
-/**
- * Logger class that writes the GTLF format
- * 
- * @version 1.0, Mar 3, 2001
- */
-public class ExtensibleGTLFLogger
-  extends GTLFLogger
-{
-  public void init(Map m) {
-      // add this in here to fetch the GTLFProperties since we don't have LoggerFactory calling it for us
-    props.putAll(GTLFProperties.getTestLogAttrsMap());
-    props.putAll(GTLFProperties.getHeaderAttrsMap());
-    props.putAll(GTLFProperties.getEnvironmentMap());
-    super.init(m);
-  }
-}
+package org.apache.beehive.test.tools.tch.logger;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+// import org.apache.beehive.test.tools.tch.util.TchUtils;
+// import org.apache.beehive.test.tools.tch.util.StringUtils;
+// import org.apache.beehive.test.tools.tch.util.TestResult;
+// import org.apache.beehive.test.tools.tch.util.gtlf.GTLFConstants;
+// import org.apache.beehive.test.tools.tch.util.gtlf.GTLFResultStripper;
+// import org.apache.beehive.test.tools.tch.util.gtlf.GTLFTestResultAdapter;
+// import org.apache.beehive.test.tools.tch.util.xml.XMLUtil;
+
+import org.apache.beehive.test.tools.tch.util.gtlf.GTLFProperties;
+
+/**
+ * Logger class that writes the GTLF format
+ * 
+ * @version 1.0, Mar 3, 2001
+ */
+public class ExtensibleGTLFLogger
+  extends GTLFLogger
+{
+  public void init(Map m) {
+      // add this in here to fetch the GTLFProperties since we don't have LoggerFactory calling it for us
+    props.putAll(GTLFProperties.getTestLogAttrsMap());
+    props.putAll(GTLFProperties.getHeaderAttrsMap());
+    props.putAll(GTLFProperties.getEnvironmentMap());
+    super.init(m);
+  }
+}

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/ExtensibleGTLFLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/FileLogger.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/FileLogger.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/FileLogger.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/FileLogger.java Fri Aug 12 08:12:28 2005
@@ -1,129 +1,129 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.text.SimpleDateFormat;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.beehive.test.tools.tch.util.TestResult;
-
-/**
- * FileLogger class.
- * <p>
- * It extracts a fileName from the information got within its init methods,
- * creates a printwriter on that file, and then creates a PrintWriterLogger 
- * for that printWriter.
- * <p>
- * The class of the printWriter logger is also got from the information 
- * available within the init methods
- * 
- * @version 1.0, Mar 3, 2001
- */
-public class FileLogger implements Logger
-{
-
-  public static final String PRINTWRITER_CLASSNAME_KEY =
-    "printwriter-logger-classname",
-    BASE_FILENAME_KEY = "file-prefix",
-    FILE_EXTENSION_KEY = "file-postfix",
-    FILENAME_KEY = "file-name";
-
-  protected int minLogLevel;
-
-  protected PrintWriter writer;
-  protected String sep = System.getProperty("line.separator");
-  protected Map props = new HashMap();
-
-  private PrintWriterLogger lg = null;
-
-  public void init(Map m)
-  {
-    props.putAll(m);
-  }
-
-  public void setMinLogLevel(int logLevel)
-  {
-    this.minLogLevel = logLevel;
-    if (lg != null)
-      lg.setMinLogLevel(logLevel);
-  }
-
-  public void setDateFormat(SimpleDateFormat in)
-  {
-    if (lg != null)
-      lg.setDateFormat(in);
-  }
-
-  /**
-   * It extracts a fileName from the information got within its init methods,
-   * creates a printwriter on that file, and then creates a PrintWriterLogger 
-   * for that printWriter.
-   * The class of the printWriter logger is also got from the information 
-   * available within the init methods
-   */
-  public void open() throws LoggerRuntimeException
-  {
-    //FIXME - remove this ugly try { } catch block.
-    try
-    {
-      String pwClassName =
-        (String)props.get(PARAM_PREFIX + PRINTWRITER_CLASSNAME_KEY);
-      if (pwClassName == null)
-        throw new LoggerRuntimeException(
-          PRINTWRITER_CLASSNAME_KEY + " not defined for this logger");
-      Class pwClass = Class.forName(pwClassName);
-
-      String fName = (String)props.get(PARAM_PREFIX + FILENAME_KEY);
-      if (fName == null)
-      {
-        String prefix = (String)props.get(PARAM_PREFIX + BASE_FILENAME_KEY);
-        if (prefix == null)
-        {
-          prefix = "tch-log";
-        }
-        String postfix = (String)props.get(PARAM_PREFIX + FILE_EXTENSION_KEY);
-        if (postfix == null)
-        {
-          int lastIndx = pwClassName.lastIndexOf(".");
-          postfix = pwClassName.substring(lastIndx + 1) + ".log";
-        }
-        fName = prefix + "." + postfix;
-      }
-      writer = new PrintWriter(new FileWriter(fName, false), true);
-
-      lg = (PrintWriterLogger)pwClass.newInstance();
-      lg.init(props);
-      lg.setPrintWriter(writer);
-      lg.setMinLogLevel(this.minLogLevel);
-      lg.open();
-    }
-    catch (Exception ex)
-    {
-      throw new LoggerRuntimeException(ex);
-    }
-  }
-
-  public void logInit(Map m)
-  {
-    if (!m.containsKey(NUM_TESTS_SENT))
-    {
-      HashMap m2 = new HashMap(m);
-      m2.put(NUM_TESTS_SENT, m.get(EXPECTED_NUM_TESTS));
-      m = m2;
-    }
-    lg.logInit(m);
-  }
-
-  public synchronized void log(TestResult res) throws LoggerRuntimeException
-  {
-    lg.log(res);
-  }
-
-  public void close() throws LoggerRuntimeException
-  {
-    lg.close();
-    writer.flush();
-    writer.close();
-  }
-}
+package org.apache.beehive.test.tools.tch.logger;
+
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.beehive.test.tools.tch.util.TestResult;
+
+/**
+ * FileLogger class.
+ * <p>
+ * It extracts a fileName from the information got within its init methods,
+ * creates a printwriter on that file, and then creates a PrintWriterLogger 
+ * for that printWriter.
+ * <p>
+ * The class of the printWriter logger is also got from the information 
+ * available within the init methods
+ * 
+ * @version 1.0, Mar 3, 2001
+ */
+public class FileLogger implements Logger
+{
+
+  public static final String PRINTWRITER_CLASSNAME_KEY =
+    "printwriter-logger-classname",
+    BASE_FILENAME_KEY = "file-prefix",
+    FILE_EXTENSION_KEY = "file-postfix",
+    FILENAME_KEY = "file-name";
+
+  protected int minLogLevel;
+
+  protected PrintWriter writer;
+  protected String sep = System.getProperty("line.separator");
+  protected Map props = new HashMap();
+
+  private PrintWriterLogger lg = null;
+
+  public void init(Map m)
+  {
+    props.putAll(m);
+  }
+
+  public void setMinLogLevel(int logLevel)
+  {
+    this.minLogLevel = logLevel;
+    if (lg != null)
+      lg.setMinLogLevel(logLevel);
+  }
+
+  public void setDateFormat(SimpleDateFormat in)
+  {
+    if (lg != null)
+      lg.setDateFormat(in);
+  }
+
+  /**
+   * It extracts a fileName from the information got within its init methods,
+   * creates a printwriter on that file, and then creates a PrintWriterLogger 
+   * for that printWriter.
+   * The class of the printWriter logger is also got from the information 
+   * available within the init methods
+   */
+  public void open() throws LoggerRuntimeException
+  {
+    //FIXME - remove this ugly try { } catch block.
+    try
+    {
+      String pwClassName =
+        (String)props.get(PARAM_PREFIX + PRINTWRITER_CLASSNAME_KEY);
+      if (pwClassName == null)
+        throw new LoggerRuntimeException(
+          PRINTWRITER_CLASSNAME_KEY + " not defined for this logger");
+      Class pwClass = Class.forName(pwClassName);
+
+      String fName = (String)props.get(PARAM_PREFIX + FILENAME_KEY);
+      if (fName == null)
+      {
+        String prefix = (String)props.get(PARAM_PREFIX + BASE_FILENAME_KEY);
+        if (prefix == null)
+        {
+          prefix = "tch-log";
+        }
+        String postfix = (String)props.get(PARAM_PREFIX + FILE_EXTENSION_KEY);
+        if (postfix == null)
+        {
+          int lastIndx = pwClassName.lastIndexOf(".");
+          postfix = pwClassName.substring(lastIndx + 1) + ".log";
+        }
+        fName = prefix + "." + postfix;
+      }
+      writer = new PrintWriter(new FileWriter(fName, false), true);
+
+      lg = (PrintWriterLogger)pwClass.newInstance();
+      lg.init(props);
+      lg.setPrintWriter(writer);
+      lg.setMinLogLevel(this.minLogLevel);
+      lg.open();
+    }
+    catch (Exception ex)
+    {
+      throw new LoggerRuntimeException(ex);
+    }
+  }
+
+  public void logInit(Map m)
+  {
+    if (!m.containsKey(NUM_TESTS_SENT))
+    {
+      HashMap m2 = new HashMap(m);
+      m2.put(NUM_TESTS_SENT, m.get(EXPECTED_NUM_TESTS));
+      m = m2;
+    }
+    lg.logInit(m);
+  }
+
+  public synchronized void log(TestResult res) throws LoggerRuntimeException
+  {
+    lg.log(res);
+  }
+
+  public void close() throws LoggerRuntimeException
+  {
+    lg.close();
+    writer.flush();
+    writer.close();
+  }
+}

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/FileLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/GTLFLogger.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/GTLFLogger.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/GTLFLogger.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/GTLFLogger.java Fri Aug 12 08:12:28 2005
@@ -1,702 +1,702 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-import java.text.SimpleDateFormat;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-import org.apache.beehive.test.tools.tch.util.TchUtils;
-import org.apache.beehive.test.tools.tch.util.GeneralUtil;
-import org.apache.beehive.test.tools.tch.util.TestResult;
-import org.apache.beehive.test.tools.tch.util.gtlf.GTLFConstants;
-import org.apache.beehive.test.tools.tch.util.gtlf.GTLFResultStripper;
-import org.apache.beehive.test.tools.tch.util.gtlf.GTLFTestResultAdapter;
-import org.apache.beehive.test.tools.tch.util.xml.XMLUtil;
-
-/**
- * Logger class that writes the GTLF format
- * 
- * @version 1.0, Mar 3, 2001
- */
-public class GTLFLogger
-  extends PrintWriterLoggerAdapter
-  implements GTLFConstants
-{
-
-  public static final String DEFAULT_DTD_REF =
-    "<!DOCTYPE "
-      + TEST_LOG_ELEMENT
-      + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
-      +   " \"http://incubator.apache.org/beehive/dtd/gtlf/gtlf-config-2.0.dtd,\">";
-
-  public static final SimpleDateFormat XML_LOG_DATEFORMAT =
-    new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
-
-  // store the global test-log env here
-  private Map globalEnv = new HashMap();
-  private Map GTLFHeaderParams = new HashMap();
-
-  public void open()
-  {
-    if (props.get(UNIQUE_RUN_ID) == null)
-    {
-      String runid = null;
-      try
-      {
-        runid = TchUtils.getUniqueRunID();
-        // FIXME - don't catch Exception
-      }
-      catch (Exception ex)
-      {
-        ex.printStackTrace();
-      }
-      props.put(PARAM_PREFIX + PARAM_RUNID, runid);
-    }
-    else
-    {
-      props.put(PARAM_PREFIX + PARAM_RUNID, props.get(UNIQUE_RUN_ID));
-    }
-
-    // use GTLFResultStripper to strip of the PARAM_PREFIX
-    if (processor == null)
-    {
-      processor = new GTLFResultStripper();
-    }
-    else if (!(processor instanceof GTLFResultStripper))
-    {
-      processor = new GTLFResultStripper().appendResultProcessor(processor);
-    }
-
-    GTLFHeaderParams = processor.processGeneric(props);
-    if (processor.errorWhileProcessing())
-    {
-      throw new LoggerRuntimeException(processor.getException());
-    }
-    globalEnv = getEnvironment(GTLFHeaderParams);
-
-    writer.println(getStartXMLLog());
-    writer.flush();
-  }
-
-  public void close()
-  {
-    writer.println(getEndXMLLog());
-    writer.flush();
-  }
-
-  /**
-   * the header-info is logged here
-   */
-  public void logInit(Map m)
-  {
-    // we do not want to override stuff in GTLFHeaderParams with null so 
-    // check that it really is in 'm' 
-    if (m.get(EXPECTED_NUM_TESTS) != null)
-    {
-      GTLFHeaderParams.put(PARAM_HEAD_RESULTCOUNT, m.get(EXPECTED_NUM_TESTS));
-    }
-    if (m.get(NUM_TESTS_SENT) != null)
-    {
-      GTLFHeaderParams.put(PARAM_HEAD_CHKSUM, m.get(NUM_TESTS_SENT));
-    }
-
-    StringBuffer buf = new StringBuffer();
-    buf.append("  <").append(HEADER_INFO_ELEMENT).append(" ").append(sep);
-
-    String[] keys =
-      new String[] {
-        PARAM_HEAD_EXECACCOUNT,
-        PARAM_HEAD_EXECDATE,
-        PARAM_HEAD_CHKSUM,
-        PARAM_HEAD_RESULTCOUNT,
-        PARAM_HEAD_HARNESSTYPE,
-        PARAM_HEAD_IMPORTINFO,
-        PARAM_HEAD_TESTRUNTYPE };
-    for (int i = 0; i < keys.length; i++)
-    {
-      Object val = GTLFHeaderParams.get(keys[i]);
-      val = (val == null ? "" : val.toString().trim());
-      buf
-        .append("    ")
-        .append(keys[i])
-        .append("=\"")
-        .append(val)
-        .append("\"")
-        .append(sep);
-    }
-    buf.append("  />").append(sep);
-    buf.append(sep);
-    writer.println(buf.toString());
-    writer.flush();
-  }
-
-  protected void logIndividualRes(TestResult res)
-  {
-    if (!res.isOutcome())
-      return;
-
-    // HACK, should not be outcome, dammit
-    // Looks like Scratch is no longer an outcome, 
-    // 99% we can remove this
-    if (res.getType() == SCRATCH_LEVEL_INT)
-    {
-      return;
-    }
-
-    // don't want these for now in GTLF
-    if (res.getType() == VALIDATION_SKIP_LEVEL_INT)
-    {
-      // return;
-    }
-
-    GTLFTestResultAdapter GTLFres =
-      (GTLFTestResultAdapter)processor.processResult(res);
-
-    if (processor.errorWhileProcessing())
-    {
-      Exception e = processor.getException();
-      processor.resetError();
-      throw new LoggerRuntimeException(e);
-    }
-
-    writer.println(getResultAsXML(GTLFres));
-    writer.flush();
-  }
-
-  protected String getStartXMLLog() throws LoggerRuntimeException
-  {
-    StringBuffer buf = new StringBuffer();
-
-    // Allow for override of dtd url
-    String use_remote = System.getProperty("gtlf.dtd.use.remote");
-    String dtd_ref;
-    // If gtlf.dtd.use.remote is not set or is true, then use the remote dtd
-    if ( use_remote == null || use_remote.toLowerCase().equals("true") )
-    {
-      String remote_dtd = System.getProperty("gtlf.dtd.remote");
-      dtd_ref = ( ( remote_dtd == null ) ? 
-        DEFAULT_DTD_REF : "<!DOCTYPE " + TEST_LOG_ELEMENT
-                  + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
-                  + " \"" + remote_dtd + "\">");
-    }else{
-      String local_dtd = System.getProperty("gtlf.dtd.local");
-      if (local_dtd == null)
-      {
-        System.out.println("WARNING: gtlf.dtd.local is not set, so using default: ./gtlf-config-2.0.dtd");
-	System.out.println("         If this file does not exist, you may experience unexpected errors.");
-	System.out.println("         To prevent any such errors, please set gtlf.dtd.local to a relative");
-	System.out.println("         path to the GTLF DTD file.");
-	dtd_ref=  "<!DOCTYPE " + TEST_LOG_ELEMENT
-                  + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
-                  + " \"gtlf-config-2.0.dtd\">";
-      }else{
-        dtd_ref=  "<!DOCTYPE " + TEST_LOG_ELEMENT
-                  + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
-                  + " \"" + local_dtd + "\">";
-      }
-    }
-    
-    buf
-      .append("<?xml version=\"1.0\"?>")
-      .append(sep)
-      .append(dtd_ref)
-      .append(sep)
-      .append(sep)
-      .append("<" + TEST_LOG_ELEMENT + " ")
-      .append(sep);
-    String testType =
-      (GTLFHeaderParams.get(PARAM_TESTTYPE) == null
-        ? "AUTOMATED"
-        : ((String)GTLFHeaderParams.get(PARAM_TESTTYPE)).trim());
-    buf
-      .append("  ")
-      .append(PARAM_TESTTYPE)
-      .append("=\"")
-      .append(testType)
-      .append("\"")
-      .append(sep);
-    String[] keys =
-      new String[] {
-        PARAM_RELEASE,
-        PARAM_LOAD,
-        PARAM_BRANCH,
-        PARAM_PHASE,
-        PARAM_CHANGE_NO,
-        PARAM_ANALYZER,
-        PARAM_HOSTNAME,
-        PARAM_TOPTESTFILE,
-        PARAM_RUNMODIFIER,
-        PARAM_RUNID };
-    for (int i = 0; i < keys.length; i++)
-    {
-      String val = (String)GTLFHeaderParams.get(keys[i]);
-      val = (val == null ? "" : val.trim());
-      buf.append("  ").append(keys[i]).append("=\"").append(val).append(
-        "\"").append(
-        sep);
-    }
-    buf.append(">").append(sep);
-    buf.append(sep);
-
-    // see if we have environment values to log
-    if (!globalEnv.isEmpty())
-    {
-      buf.append("  <").append(ENVIRONMENT_ELEMENT).append(">").append(sep);
-      Iterator i = globalEnv.keySet().iterator();
-      while (i.hasNext())
-      {
-        String key = (String)i.next();
-        String trimkey = key.trim();
-        if (trimkey.startsWith(PARAM_PREFIX))
-        {
-          trimkey = trimkey.substring(PARAM_PREFIX.length());
-        }
-        buf
-          .append("    <")
-          .append(ENV_ATT_ELEMENT)
-          .append(" ")
-          .append(PARAM_NAME)
-          .append("=\"")
-          .append(trimkey)
-          .append("\" ")
-          .append(PARAM_VALUE)
-          .append("=\"")
-          .append(((String)globalEnv.get(key)).trim())
-          .append("\"/>")
-          .append(sep);
-      }
-      buf.append("  </").append(ENVIRONMENT_ELEMENT).append(">").append(
-        sep).append(
-        sep);
-    }
-
-    return buf.toString();
-  }
-
-  protected String getEndXMLLog()
-  {
-    return "</" + TEST_LOG_ELEMENT + ">";
-  }
-
-  protected String getResultAsXML(GTLFTestResultAdapter res)
-  {
-    StringBuffer outputMsg =
-      new StringBuffer(
-        GeneralUtil.StringOrNullToEmptyString(res.getOutputMessage()));
-    if (res.getDetails() != null && res.getDetails().trim().length() > 0)
-    {
-      outputMsg.append(sep).append(sep).append(res.getDetails().trim()).append(
-        sep);
-    }
-
-    String status = LoggerUtils.asLogLevelString(res.getType()).trim();
-    Long duration = res.getDuration();
-
-    String reviewState =
-      (res.getReviewState() == null ? null : res.getReviewState().trim());
-    String comments =
-      (res.getComments() == null ? null : res.getComments().trim());
-    String bugID = (res.getBugID() == null ? null : res.getBugID().trim());
-    String outcomeRes = "FALSE";
-
-    String logicalName = (res.getName() == null ? null : res.getName().trim());
-
-    // hack because we don't want the testunit to be part of the logical name in GTLF
-    // should fix our code so we don't prepend the testunit to the logical name until
-    // we get to the logger code. this can be fixed pretty easily by adding two more things
-    // to the result object: logical-test-name and subtest name. name, in result object,
-    // should be renamed to "fullName" or something.
-    if (logicalName != null && res.getTestUnitName() != null)
-    {
-      String testUnitName = res.getTestUnitName();
-      int logicalNameLength = logicalName.length() - testUnitName.length();
-      if (logicalNameLength > 0)
-        logicalName = logicalName.substring(testUnitName.length() + 1);
-    }
-
-    if (res.isOutcome())
-    {
-      outcomeRes = "TRUE";
-    }
-
-    StringBuffer buf = new StringBuffer();
-    buf
-      .append("  <")
-      .append(TEST_RESULT_ELEMENT)
-      .append(sep)
-      .append("    ")
-      .append(PARAM_RESULT_EXECTIME)
-      .append("=\"")
-      .append(new java.sql.Timestamp(res.getTimeStamp().getTime()).toString())
-      .append("\"")
-      .append(sep)
-      .append("    ")
-      .append(PARAM_RESULT_RESULT)
-      .append("=\"")
-      .append(status)
-      .append("\"")
-      .append(sep);
-
-    String resultinfo = res.getResultInfo();
-    if (resultinfo != null) {
-	buf
-	    .append("    ")
-	    .append(PARAM_RESULT_RESULTINFO)
-	    .append("=\"")
-	    .append(resultinfo)
-	    .append("\"")
-	    .append(sep);
-      }
-    buf
-      .append("    ")
-      .append(PARAM_RESULT_ISDONE)
-      .append("=\"")
-      .append(outcomeRes)
-      .append("\"")
-      .append(sep);
-
-    if (logicalName != null)
-    {
-      buf
-        .append("    ")
-        .append(PARAM_RESULT_LOGICAL_NAME)
-        .append("=\"")
-        .append(logicalName)
-        .append("\"")
-        .append(sep);
-    }
-
-    if (duration != null)
-    {
-      buf
-        .append("    ")
-        .append(PARAM_RESULT_DURATION)
-        .append("=\"")
-        .append(String.valueOf(duration))
-        .append("\"")
-        .append(sep);
-    }
-    if (reviewState != null && reviewState.length() > 0)
-    {
-      buf
-        .append("    ")
-        .append(PARAM_RESULT_REVIEWSTATE)
-        .append("=\"")
-        .append(reviewState)
-        .append("\"")
-        .append(sep);
-    }
-    if (bugID != null && bugID.length() > 0)
-    {
-      buf
-        .append("    ")
-        .append(PARAM_RESULT_CRLIST)
-        .append("=\"")
-        .append(bugID)
-        .append("\"")
-        .append(sep);
-    }
-    buf.append("  >").append(sep);
-    buf.append("    <").append(TEST_CASE_ELEMENT).append(sep);
-    // hack - see if test-case is set. if it is, use it, else use
-    // the regular (logical) name (which is actually the test-point name)
-    String testCaseName = res.getTestCaseName();
-    if (testCaseName != null)
-    {
-      String subtestName = res.getSubtestName();
-      if (subtestName != null)
-      {
-        testCaseName += "." + subtestName;
-      }
-    }
-    else
-    {
-      testCaseName = res.getName();
-    }
-
-    buf
-      .append("      ")
-      .append(PARAM_TEST_CASE_NAME)
-      .append("=\"")
-      .append(testCaseName)
-      .append("\"")
-      .append(sep)
-      .append("      ")
-      .append(PARAM_TEST_UNIT)
-      .append("=\"")
-      .append(res.getTestUnitName())
-      .append("\"")
-      .append(sep)
-      .append("      ")
-      .append(PARAM_TEST_PATH)
-      .append("=\"")
-      .append(res.getSourcePath())
-      .append("\"")
-      .append(sep)
-      .append("    />")
-      .append(sep);
-
-    // <environment>
-    Map testEnv = getUpdatedValues(globalEnv, res.getEnvironment());
-    if (!testEnv.isEmpty())
-    {
-      buf.append("    <").append(ENVIRONMENT_ELEMENT).append(">").append(sep);
-      Iterator i = testEnv.keySet().iterator();
-      while (i.hasNext())
-      {
-        String key = (String)i.next();
-        String trimkey = key.trim();
-        if (trimkey.startsWith(PARAM_PREFIX))
-        {
-          trimkey = trimkey.substring(PARAM_PREFIX.length());
-        }
-        buf
-          .append("      <")
-          .append(ENV_ATT_ELEMENT)
-          .append(" ")
-          .append(PARAM_NAME)
-          .append("=\"")
-          .append(trimkey)
-          .append("\" ")
-          .append(PARAM_VALUE)
-          .append("=\"")
-          .append(((String)testEnv.get(key)).trim())
-          .append("\"/>")
-          .append(sep);
-      }
-      buf.append("    </").append(ENVIRONMENT_ELEMENT).append(">").append(
-        sep).append(
-        sep);
-    }
-
-    // <test-parameters>
-    Map params = res.getParameters();
-    if (params != null && params.size() > 0)
-    {
-      // we want test parameters to be sorted
-      TreeMap sortedParams = new TreeMap(params);
-      StringBuffer buf2 = new StringBuffer();
-      for (Iterator itr = sortedParams.keySet().iterator(); itr.hasNext();)
-      {
-        Object key1 = itr.next();
-        Object value1 = sortedParams.get(key1);
-        if (value1 == null)
-          continue;
-        buf2.append(key1.toString()).append("=").append(
-          value1.toString()).append(
-          sep);
-      }
-      buf.append("    <").append(TEST_PARAMETERS_ELEMENT).append(">").append(
-        sep);
-      buf.append(XMLUtil.escape(buf2.toString()));
-      buf.append("</").append(TEST_PARAMETERS_ELEMENT).append(">").append(sep);
-    }
-
-    buf.append("    <").append(EXECUTION_OUTPUT_ELEMENT).append(" ");
-
-    boolean setErrorName = false;
-    if (res.getErrorName() != null)
-    {
-      buf
-        .append(" ")
-        .append(PARAM_OUTPUT_ERRORNAME)
-        .append("=\"")
-        .append(XMLUtil.escape(res.getErrorName()))
-        .append("\">")
-        .append(sep);
-      setErrorName = true;
-    }
-
-    if (res.hasThrowable())
-    {
-      Throwable thr = res.getThrowable();
-      if (!setErrorName)
-      {
-        // if no error name passed explicitly, use exception class name, if we have one
-        buf
-          .append(" ")
-          .append(PARAM_OUTPUT_ERRORNAME)
-          .append("=\"")
-          .append(thr.getClass().getName())
-          .append("\">")
-          .append(sep);
-      }
-      buf
-        .append("      <")
-        .append(OUTPUT_DETAILS_ELEMENT)
-        .append(">")
-        .append(XMLUtil.escape(outputMsg.toString()))
-        .append(sep);
-      buf.append(XMLUtil.escape(res.getStackTrace()));
-    }
-    else
-    {
-      if (!setErrorName)
-      {
-        buf.append(">"); // close execution-output
-      }
-
-      buf
-        .append("      <")
-        .append(OUTPUT_DETAILS_ELEMENT)
-        .append(">")
-        .append(XMLUtil.escape(outputMsg.toString()))
-        .append(sep);
-    }
-    buf
-      .append("      </")
-      .append(OUTPUT_DETAILS_ELEMENT)
-      .append(">")
-      .append(sep)
-      .append("    </")
-      .append(EXECUTION_OUTPUT_ELEMENT)
-      .append(">")
-      .append(sep);
-
-    if (comments != null && comments.length() > 0)
-    {
-      buf
-        .append("    <")
-        .append(REVIEWER_COMMENTS_ELEMENT)
-        .append(">")
-        .append(sep)
-        .append(XMLUtil.escape(comments))
-        .append("</")
-        .append(REVIEWER_COMMENTS_ELEMENT)
-        .append(">")
-        .append(sep);
-    }
-
-    String replicationInfo =
-      GeneralUtil.emptyStringOrNullToNull(res.getReplicationInfo());
-    String cmdline = GeneralUtil.emptyStringOrNullToNull(res.getCommandLine());
-    String winCmdline =
-      GeneralUtil.emptyStringOrNullToNull(res.getWinCommandLine());
-    if (cmdline != null)
-    {
-      buf.append("    <").append(TEST_REPLICATION_ELEMENT).append(">").append(
-        sep);
-
-      if (replicationInfo != null)
-      {
-        buf
-          .append("      <")
-          .append(INFO_ELEMENT)
-          .append(">")
-          .append(XMLUtil.escape(replicationInfo))
-          .append("</")
-          .append(INFO_ELEMENT)
-          .append(">")
-          .append(sep);
-      }
-
-      // print unix command line, checked above that it is not null
-      buf
-        .append("      <")
-        .append(COMMAND_LINE_ELEMENT)
-        .append(">")
-        .append(sep)
-        .append("        <")
-        .append(UNIX_ELEMENT)
-        .append(">")
-        .append(XMLUtil.escape(cmdline))
-        .append("</")
-        .append(UNIX_ELEMENT)
-        .append(">")
-        .append(sep);
-
-      // print windows specific command line, if we have one
-      if (winCmdline != null)
-      {
-        buf
-          .append("        <")
-          .append(WIN_ELEMENT)
-          .append(">")
-          .append(XMLUtil.escape(winCmdline))
-          .append("</")
-          .append(WIN_ELEMENT)
-          .append(">")
-          .append(sep);
-      }
-
-      buf
-        .append("      </")
-        .append(COMMAND_LINE_ELEMENT)
-        .append(">")
-        .append(sep);
-
-      buf
-        .append("    </")
-        .append(TEST_REPLICATION_ELEMENT)
-        .append(">")
-        .append(sep);
-    }
-
-    buf.append("  </").append(TEST_RESULT_ELEMENT).append(">").append(sep);
-    return buf.toString();
-  }
-
-  // anything the logger does not explicitly know about is an env
-  private Map getEnvironment(Map inMap)
-  {
-    Map envMap = new HashMap();
-    if (inMap != null)
-    {
-      String[] params =
-        new String[] {
-          PARAM_RUNID,
-          PARAM_TESTTYPE,
-          PARAM_CHANGE_NO,
-          PARAM_RELEASE,
-          PARAM_LOAD,
-          PARAM_BRANCH,
-          PARAM_PHASE,
-          PARAM_ANALYZER,
-          PARAM_HOSTNAME,
-          PARAM_TOPTESTFILE,
-          PARAM_RUNMODIFIER,
-          PARAM_HEAD_TESTRUNTYPE,
-          PARAM_HEAD_CHKSUM,
-          PARAM_HEAD_RESULTCOUNT,
-          PARAM_HEAD_EXECACCOUNT,
-          PARAM_HEAD_EXECDATE,
-          PARAM_HEAD_IMPORTERNAME,
-          PARAM_HEAD_HARNESSTYPE,
-          PARAM_HEAD_IMPORTINFO };
-      Set knownParamsSet = new HashSet();
-      for (int i = 0; i < params.length; i++)
-      {
-        knownParamsSet.add(params[i]);
-      }
-      Iterator i = inMap.keySet().iterator();
-      while (i.hasNext())
-      {
-        String key = (String)i.next();
-        if (!knownParamsSet.contains(key))
-        {
-          envMap.put(key, inMap.get(key));
-        }
-      }
-    }
-    return envMap;
-  }
-
-  private Map getUpdatedValues(Map oldMap, Map newMap)
-  {
-    Map resultMap = new TreeMap();
-    Iterator iter = newMap.keySet().iterator();
-    while (iter.hasNext())
-    {
-      String key = (String)iter.next();
-      // take it if it does not exist in old map, or if
-      // value in newMap is different from the one in oldMap
-      if (oldMap.get(key) == null || !oldMap.get(key).equals(newMap.get(key)))
-        resultMap.put(key, newMap.get(key));
-
-    }
-    return resultMap;
-  }
-}
+package org.apache.beehive.test.tools.tch.logger;
+
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.beehive.test.tools.tch.util.TchUtils;
+import org.apache.beehive.test.tools.tch.util.GeneralUtil;
+import org.apache.beehive.test.tools.tch.util.TestResult;
+import org.apache.beehive.test.tools.tch.util.gtlf.GTLFConstants;
+import org.apache.beehive.test.tools.tch.util.gtlf.GTLFResultStripper;
+import org.apache.beehive.test.tools.tch.util.gtlf.GTLFTestResultAdapter;
+import org.apache.beehive.test.tools.tch.util.xml.XMLUtil;
+
+/**
+ * Logger class that writes the GTLF format
+ * 
+ * @version 1.0, Mar 3, 2001
+ */
+public class GTLFLogger
+  extends PrintWriterLoggerAdapter
+  implements GTLFConstants
+{
+
+  public static final String DEFAULT_DTD_REF =
+    "<!DOCTYPE "
+      + TEST_LOG_ELEMENT
+      + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
+      +   " \"http://incubator.apache.org/beehive/dtd/gtlf/gtlf-config-2.0.dtd,\">";
+
+  public static final SimpleDateFormat XML_LOG_DATEFORMAT =
+    new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
+
+  // store the global test-log env here
+  private Map globalEnv = new HashMap();
+  private Map GTLFHeaderParams = new HashMap();
+
+  public void open()
+  {
+    if (props.get(UNIQUE_RUN_ID) == null)
+    {
+      String runid = null;
+      try
+      {
+        runid = TchUtils.getUniqueRunID();
+        // FIXME - don't catch Exception
+      }
+      catch (Exception ex)
+      {
+        ex.printStackTrace();
+      }
+      props.put(PARAM_PREFIX + PARAM_RUNID, runid);
+    }
+    else
+    {
+      props.put(PARAM_PREFIX + PARAM_RUNID, props.get(UNIQUE_RUN_ID));
+    }
+
+    // use GTLFResultStripper to strip of the PARAM_PREFIX
+    if (processor == null)
+    {
+      processor = new GTLFResultStripper();
+    }
+    else if (!(processor instanceof GTLFResultStripper))
+    {
+      processor = new GTLFResultStripper().appendResultProcessor(processor);
+    }
+
+    GTLFHeaderParams = processor.processGeneric(props);
+    if (processor.errorWhileProcessing())
+    {
+      throw new LoggerRuntimeException(processor.getException());
+    }
+    globalEnv = getEnvironment(GTLFHeaderParams);
+
+    writer.println(getStartXMLLog());
+    writer.flush();
+  }
+
+  public void close()
+  {
+    writer.println(getEndXMLLog());
+    writer.flush();
+  }
+
+  /**
+   * the header-info is logged here
+   */
+  public void logInit(Map m)
+  {
+    // we do not want to override stuff in GTLFHeaderParams with null so 
+    // check that it really is in 'm' 
+    if (m.get(EXPECTED_NUM_TESTS) != null)
+    {
+      GTLFHeaderParams.put(PARAM_HEAD_RESULTCOUNT, m.get(EXPECTED_NUM_TESTS));
+    }
+    if (m.get(NUM_TESTS_SENT) != null)
+    {
+      GTLFHeaderParams.put(PARAM_HEAD_CHKSUM, m.get(NUM_TESTS_SENT));
+    }
+
+    StringBuffer buf = new StringBuffer();
+    buf.append("  <").append(HEADER_INFO_ELEMENT).append(" ").append(sep);
+
+    String[] keys =
+      new String[] {
+        PARAM_HEAD_EXECACCOUNT,
+        PARAM_HEAD_EXECDATE,
+        PARAM_HEAD_CHKSUM,
+        PARAM_HEAD_RESULTCOUNT,
+        PARAM_HEAD_HARNESSTYPE,
+        PARAM_HEAD_IMPORTINFO,
+        PARAM_HEAD_TESTRUNTYPE };
+    for (int i = 0; i < keys.length; i++)
+    {
+      Object val = GTLFHeaderParams.get(keys[i]);
+      val = (val == null ? "" : val.toString().trim());
+      buf
+        .append("    ")
+        .append(keys[i])
+        .append("=\"")
+        .append(val)
+        .append("\"")
+        .append(sep);
+    }
+    buf.append("  />").append(sep);
+    buf.append(sep);
+    writer.println(buf.toString());
+    writer.flush();
+  }
+
+  protected void logIndividualRes(TestResult res)
+  {
+    if (!res.isOutcome())
+      return;
+
+    // HACK, should not be outcome, dammit
+    // Looks like Scratch is no longer an outcome, 
+    // 99% we can remove this
+    if (res.getType() == SCRATCH_LEVEL_INT)
+    {
+      return;
+    }
+
+    // don't want these for now in GTLF
+    if (res.getType() == VALIDATION_SKIP_LEVEL_INT)
+    {
+      // return;
+    }
+
+    GTLFTestResultAdapter GTLFres =
+      (GTLFTestResultAdapter)processor.processResult(res);
+
+    if (processor.errorWhileProcessing())
+    {
+      Exception e = processor.getException();
+      processor.resetError();
+      throw new LoggerRuntimeException(e);
+    }
+
+    writer.println(getResultAsXML(GTLFres));
+    writer.flush();
+  }
+
+  protected String getStartXMLLog() throws LoggerRuntimeException
+  {
+    StringBuffer buf = new StringBuffer();
+
+    // Allow for override of dtd url
+    String use_remote = System.getProperty("gtlf.dtd.use.remote");
+    String dtd_ref;
+    // If gtlf.dtd.use.remote is not set or is true, then use the remote dtd
+    if ( use_remote == null || use_remote.toLowerCase().equals("true") )
+    {
+      String remote_dtd = System.getProperty("gtlf.dtd.remote");
+      dtd_ref = ( ( remote_dtd == null ) ? 
+        DEFAULT_DTD_REF : "<!DOCTYPE " + TEST_LOG_ELEMENT
+                  + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
+                  + " \"" + remote_dtd + "\">");
+    }else{
+      String local_dtd = System.getProperty("gtlf.dtd.local");
+      if (local_dtd == null)
+      {
+        System.out.println("WARNING: gtlf.dtd.local is not set, so using default: ./gtlf-config-2.0.dtd");
+	System.out.println("         If this file does not exist, you may experience unexpected errors.");
+	System.out.println("         To prevent any such errors, please set gtlf.dtd.local to a relative");
+	System.out.println("         path to the GTLF DTD file.");
+	dtd_ref=  "<!DOCTYPE " + TEST_LOG_ELEMENT
+                  + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
+                  + " \"gtlf-config-2.0.dtd\">";
+      }else{
+        dtd_ref=  "<!DOCTYPE " + TEST_LOG_ELEMENT
+                  + " PUBLIC \"-//BEA Systems, Inc.//DTD GTLF 1.0//EN\""
+                  + " \"" + local_dtd + "\">";
+      }
+    }
+    
+    buf
+      .append("<?xml version=\"1.0\"?>")
+      .append(sep)
+      .append(dtd_ref)
+      .append(sep)
+      .append(sep)
+      .append("<" + TEST_LOG_ELEMENT + " ")
+      .append(sep);
+    String testType =
+      (GTLFHeaderParams.get(PARAM_TESTTYPE) == null
+        ? "AUTOMATED"
+        : ((String)GTLFHeaderParams.get(PARAM_TESTTYPE)).trim());
+    buf
+      .append("  ")
+      .append(PARAM_TESTTYPE)
+      .append("=\"")
+      .append(testType)
+      .append("\"")
+      .append(sep);
+    String[] keys =
+      new String[] {
+        PARAM_RELEASE,
+        PARAM_LOAD,
+        PARAM_BRANCH,
+        PARAM_PHASE,
+        PARAM_CHANGE_NO,
+        PARAM_ANALYZER,
+        PARAM_HOSTNAME,
+        PARAM_TOPTESTFILE,
+        PARAM_RUNMODIFIER,
+        PARAM_RUNID };
+    for (int i = 0; i < keys.length; i++)
+    {
+      String val = (String)GTLFHeaderParams.get(keys[i]);
+      val = (val == null ? "" : val.trim());
+      buf.append("  ").append(keys[i]).append("=\"").append(val).append(
+        "\"").append(
+        sep);
+    }
+    buf.append(">").append(sep);
+    buf.append(sep);
+
+    // see if we have environment values to log
+    if (!globalEnv.isEmpty())
+    {
+      buf.append("  <").append(ENVIRONMENT_ELEMENT).append(">").append(sep);
+      Iterator i = globalEnv.keySet().iterator();
+      while (i.hasNext())
+      {
+        String key = (String)i.next();
+        String trimkey = key.trim();
+        if (trimkey.startsWith(PARAM_PREFIX))
+        {
+          trimkey = trimkey.substring(PARAM_PREFIX.length());
+        }
+        buf
+          .append("    <")
+          .append(ENV_ATT_ELEMENT)
+          .append(" ")
+          .append(PARAM_NAME)
+          .append("=\"")
+          .append(trimkey)
+          .append("\" ")
+          .append(PARAM_VALUE)
+          .append("=\"")
+          .append(((String)globalEnv.get(key)).trim())
+          .append("\"/>")
+          .append(sep);
+      }
+      buf.append("  </").append(ENVIRONMENT_ELEMENT).append(">").append(
+        sep).append(
+        sep);
+    }
+
+    return buf.toString();
+  }
+
+  protected String getEndXMLLog()
+  {
+    return "</" + TEST_LOG_ELEMENT + ">";
+  }
+
+  protected String getResultAsXML(GTLFTestResultAdapter res)
+  {
+    StringBuffer outputMsg =
+      new StringBuffer(
+        GeneralUtil.StringOrNullToEmptyString(res.getOutputMessage()));
+    if (res.getDetails() != null && res.getDetails().trim().length() > 0)
+    {
+      outputMsg.append(sep).append(sep).append(res.getDetails().trim()).append(
+        sep);
+    }
+
+    String status = LoggerUtils.asLogLevelString(res.getType()).trim();
+    Long duration = res.getDuration();
+
+    String reviewState =
+      (res.getReviewState() == null ? null : res.getReviewState().trim());
+    String comments =
+      (res.getComments() == null ? null : res.getComments().trim());
+    String bugID = (res.getBugID() == null ? null : res.getBugID().trim());
+    String outcomeRes = "FALSE";
+
+    String logicalName = (res.getName() == null ? null : res.getName().trim());
+
+    // hack because we don't want the testunit to be part of the logical name in GTLF
+    // should fix our code so we don't prepend the testunit to the logical name until
+    // we get to the logger code. this can be fixed pretty easily by adding two more things
+    // to the result object: logical-test-name and subtest name. name, in result object,
+    // should be renamed to "fullName" or something.
+    if (logicalName != null && res.getTestUnitName() != null)
+    {
+      String testUnitName = res.getTestUnitName();
+      int logicalNameLength = logicalName.length() - testUnitName.length();
+      if (logicalNameLength > 0)
+        logicalName = logicalName.substring(testUnitName.length() + 1);
+    }
+
+    if (res.isOutcome())
+    {
+      outcomeRes = "TRUE";
+    }
+
+    StringBuffer buf = new StringBuffer();
+    buf
+      .append("  <")
+      .append(TEST_RESULT_ELEMENT)
+      .append(sep)
+      .append("    ")
+      .append(PARAM_RESULT_EXECTIME)
+      .append("=\"")
+      .append(new java.sql.Timestamp(res.getTimeStamp().getTime()).toString())
+      .append("\"")
+      .append(sep)
+      .append("    ")
+      .append(PARAM_RESULT_RESULT)
+      .append("=\"")
+      .append(status)
+      .append("\"")
+      .append(sep);
+
+    String resultinfo = res.getResultInfo();
+    if (resultinfo != null) {
+	buf
+	    .append("    ")
+	    .append(PARAM_RESULT_RESULTINFO)
+	    .append("=\"")
+	    .append(resultinfo)
+	    .append("\"")
+	    .append(sep);
+      }
+    buf
+      .append("    ")
+      .append(PARAM_RESULT_ISDONE)
+      .append("=\"")
+      .append(outcomeRes)
+      .append("\"")
+      .append(sep);
+
+    if (logicalName != null)
+    {
+      buf
+        .append("    ")
+        .append(PARAM_RESULT_LOGICAL_NAME)
+        .append("=\"")
+        .append(logicalName)
+        .append("\"")
+        .append(sep);
+    }
+
+    if (duration != null)
+    {
+      buf
+        .append("    ")
+        .append(PARAM_RESULT_DURATION)
+        .append("=\"")
+        .append(String.valueOf(duration))
+        .append("\"")
+        .append(sep);
+    }
+    if (reviewState != null && reviewState.length() > 0)
+    {
+      buf
+        .append("    ")
+        .append(PARAM_RESULT_REVIEWSTATE)
+        .append("=\"")
+        .append(reviewState)
+        .append("\"")
+        .append(sep);
+    }
+    if (bugID != null && bugID.length() > 0)
+    {
+      buf
+        .append("    ")
+        .append(PARAM_RESULT_CRLIST)
+        .append("=\"")
+        .append(bugID)
+        .append("\"")
+        .append(sep);
+    }
+    buf.append("  >").append(sep);
+    buf.append("    <").append(TEST_CASE_ELEMENT).append(sep);
+    // hack - see if test-case is set. if it is, use it, else use
+    // the regular (logical) name (which is actually the test-point name)
+    String testCaseName = res.getTestCaseName();
+    if (testCaseName != null)
+    {
+      String subtestName = res.getSubtestName();
+      if (subtestName != null)
+      {
+        testCaseName += "." + subtestName;
+      }
+    }
+    else
+    {
+      testCaseName = res.getName();
+    }
+
+    buf
+      .append("      ")
+      .append(PARAM_TEST_CASE_NAME)
+      .append("=\"")
+      .append(testCaseName)
+      .append("\"")
+      .append(sep)
+      .append("      ")
+      .append(PARAM_TEST_UNIT)
+      .append("=\"")
+      .append(res.getTestUnitName())
+      .append("\"")
+      .append(sep)
+      .append("      ")
+      .append(PARAM_TEST_PATH)
+      .append("=\"")
+      .append(res.getSourcePath())
+      .append("\"")
+      .append(sep)
+      .append("    />")
+      .append(sep);
+
+    // <environment>
+    Map testEnv = getUpdatedValues(globalEnv, res.getEnvironment());
+    if (!testEnv.isEmpty())
+    {
+      buf.append("    <").append(ENVIRONMENT_ELEMENT).append(">").append(sep);
+      Iterator i = testEnv.keySet().iterator();
+      while (i.hasNext())
+      {
+        String key = (String)i.next();
+        String trimkey = key.trim();
+        if (trimkey.startsWith(PARAM_PREFIX))
+        {
+          trimkey = trimkey.substring(PARAM_PREFIX.length());
+        }
+        buf
+          .append("      <")
+          .append(ENV_ATT_ELEMENT)
+          .append(" ")
+          .append(PARAM_NAME)
+          .append("=\"")
+          .append(trimkey)
+          .append("\" ")
+          .append(PARAM_VALUE)
+          .append("=\"")
+          .append(((String)testEnv.get(key)).trim())
+          .append("\"/>")
+          .append(sep);
+      }
+      buf.append("    </").append(ENVIRONMENT_ELEMENT).append(">").append(
+        sep).append(
+        sep);
+    }
+
+    // <test-parameters>
+    Map params = res.getParameters();
+    if (params != null && params.size() > 0)
+    {
+      // we want test parameters to be sorted
+      TreeMap sortedParams = new TreeMap(params);
+      StringBuffer buf2 = new StringBuffer();
+      for (Iterator itr = sortedParams.keySet().iterator(); itr.hasNext();)
+      {
+        Object key1 = itr.next();
+        Object value1 = sortedParams.get(key1);
+        if (value1 == null)
+          continue;
+        buf2.append(key1.toString()).append("=").append(
+          value1.toString()).append(
+          sep);
+      }
+      buf.append("    <").append(TEST_PARAMETERS_ELEMENT).append(">").append(
+        sep);
+      buf.append(XMLUtil.escape(buf2.toString()));
+      buf.append("</").append(TEST_PARAMETERS_ELEMENT).append(">").append(sep);
+    }
+
+    buf.append("    <").append(EXECUTION_OUTPUT_ELEMENT).append(" ");
+
+    boolean setErrorName = false;
+    if (res.getErrorName() != null)
+    {
+      buf
+        .append(" ")
+        .append(PARAM_OUTPUT_ERRORNAME)
+        .append("=\"")
+        .append(XMLUtil.escape(res.getErrorName()))
+        .append("\">")
+        .append(sep);
+      setErrorName = true;
+    }
+
+    if (res.hasThrowable())
+    {
+      Throwable thr = res.getThrowable();
+      if (!setErrorName)
+      {
+        // if no error name passed explicitly, use exception class name, if we have one
+        buf
+          .append(" ")
+          .append(PARAM_OUTPUT_ERRORNAME)
+          .append("=\"")
+          .append(thr.getClass().getName())
+          .append("\">")
+          .append(sep);
+      }
+      buf
+        .append("      <")
+        .append(OUTPUT_DETAILS_ELEMENT)
+        .append(">")
+        .append(XMLUtil.escape(outputMsg.toString()))
+        .append(sep);
+      buf.append(XMLUtil.escape(res.getStackTrace()));
+    }
+    else
+    {
+      if (!setErrorName)
+      {
+        buf.append(">"); // close execution-output
+      }
+
+      buf
+        .append("      <")
+        .append(OUTPUT_DETAILS_ELEMENT)
+        .append(">")
+        .append(XMLUtil.escape(outputMsg.toString()))
+        .append(sep);
+    }
+    buf
+      .append("      </")
+      .append(OUTPUT_DETAILS_ELEMENT)
+      .append(">")
+      .append(sep)
+      .append("    </")
+      .append(EXECUTION_OUTPUT_ELEMENT)
+      .append(">")
+      .append(sep);
+
+    if (comments != null && comments.length() > 0)
+    {
+      buf
+        .append("    <")
+        .append(REVIEWER_COMMENTS_ELEMENT)
+        .append(">")
+        .append(sep)
+        .append(XMLUtil.escape(comments))
+        .append("</")
+        .append(REVIEWER_COMMENTS_ELEMENT)
+        .append(">")
+        .append(sep);
+    }
+
+    String replicationInfo =
+      GeneralUtil.emptyStringOrNullToNull(res.getReplicationInfo());
+    String cmdline = GeneralUtil.emptyStringOrNullToNull(res.getCommandLine());
+    String winCmdline =
+      GeneralUtil.emptyStringOrNullToNull(res.getWinCommandLine());
+    if (cmdline != null)
+    {
+      buf.append("    <").append(TEST_REPLICATION_ELEMENT).append(">").append(
+        sep);
+
+      if (replicationInfo != null)
+      {
+        buf
+          .append("      <")
+          .append(INFO_ELEMENT)
+          .append(">")
+          .append(XMLUtil.escape(replicationInfo))
+          .append("</")
+          .append(INFO_ELEMENT)
+          .append(">")
+          .append(sep);
+      }
+
+      // print unix command line, checked above that it is not null
+      buf
+        .append("      <")
+        .append(COMMAND_LINE_ELEMENT)
+        .append(">")
+        .append(sep)
+        .append("        <")
+        .append(UNIX_ELEMENT)
+        .append(">")
+        .append(XMLUtil.escape(cmdline))
+        .append("</")
+        .append(UNIX_ELEMENT)
+        .append(">")
+        .append(sep);
+
+      // print windows specific command line, if we have one
+      if (winCmdline != null)
+      {
+        buf
+          .append("        <")
+          .append(WIN_ELEMENT)
+          .append(">")
+          .append(XMLUtil.escape(winCmdline))
+          .append("</")
+          .append(WIN_ELEMENT)
+          .append(">")
+          .append(sep);
+      }
+
+      buf
+        .append("      </")
+        .append(COMMAND_LINE_ELEMENT)
+        .append(">")
+        .append(sep);
+
+      buf
+        .append("    </")
+        .append(TEST_REPLICATION_ELEMENT)
+        .append(">")
+        .append(sep);
+    }
+
+    buf.append("  </").append(TEST_RESULT_ELEMENT).append(">").append(sep);
+    return buf.toString();
+  }
+
+  // anything the logger does not explicitly know about is an env
+  private Map getEnvironment(Map inMap)
+  {
+    Map envMap = new HashMap();
+    if (inMap != null)
+    {
+      String[] params =
+        new String[] {
+          PARAM_RUNID,
+          PARAM_TESTTYPE,
+          PARAM_CHANGE_NO,
+          PARAM_RELEASE,
+          PARAM_LOAD,
+          PARAM_BRANCH,
+          PARAM_PHASE,
+          PARAM_ANALYZER,
+          PARAM_HOSTNAME,
+          PARAM_TOPTESTFILE,
+          PARAM_RUNMODIFIER,
+          PARAM_HEAD_TESTRUNTYPE,
+          PARAM_HEAD_CHKSUM,
+          PARAM_HEAD_RESULTCOUNT,
+          PARAM_HEAD_EXECACCOUNT,
+          PARAM_HEAD_EXECDATE,
+          PARAM_HEAD_IMPORTERNAME,
+          PARAM_HEAD_HARNESSTYPE,
+          PARAM_HEAD_IMPORTINFO };
+      Set knownParamsSet = new HashSet();
+      for (int i = 0; i < params.length; i++)
+      {
+        knownParamsSet.add(params[i]);
+      }
+      Iterator i = inMap.keySet().iterator();
+      while (i.hasNext())
+      {
+        String key = (String)i.next();
+        if (!knownParamsSet.contains(key))
+        {
+          envMap.put(key, inMap.get(key));
+        }
+      }
+    }
+    return envMap;
+  }
+
+  private Map getUpdatedValues(Map oldMap, Map newMap)
+  {
+    Map resultMap = new TreeMap();
+    Iterator iter = newMap.keySet().iterator();
+    while (iter.hasNext())
+    {
+      String key = (String)iter.next();
+      // take it if it does not exist in old map, or if
+      // value in newMap is different from the one in oldMap
+      if (oldMap.get(key) == null || !oldMap.get(key).equals(newMap.get(key)))
+        resultMap.put(key, newMap.get(key));
+
+    }
+    return resultMap;
+  }
+}

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/GTLFLogger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogDestination.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogDestination.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogDestination.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogDestination.java Fri Aug 12 08:12:28 2005
@@ -1,20 +1,20 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-/**
- */
-public class LogDestination
-{
-  public static final LogDestination CONSOLE = new LogDestination();
-  public static final LogDestination FILE = new LogDestination();
-  public static final LogDestination JAR = new LogDestination();
-
-  private LogDestination(){}
-  
-  public String toString()
-  {
-  	if (this == CONSOLE) return "console";
-  	else if (this == FILE) return "file";
-  	else if (this == JAR) return "jar";
-    else return "you will never see this";
-  }
-}
+package org.apache.beehive.test.tools.tch.logger;
+
+/**
+ */
+public class LogDestination
+{
+  public static final LogDestination CONSOLE = new LogDestination();
+  public static final LogDestination FILE = new LogDestination();
+  public static final LogDestination JAR = new LogDestination();
+
+  private LogDestination(){}
+  
+  public String toString()
+  {
+  	if (this == CONSOLE) return "console";
+  	else if (this == FILE) return "file";
+  	else if (this == JAR) return "jar";
+    else return "you will never see this";
+  }
+}

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogDestination.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogType.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogType.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogType.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogType.java Fri Aug 12 08:12:28 2005
@@ -1,26 +1,26 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-/**
- */
-public class LogType
-{
-  public static final LogType STANDARD = new LogType();
-  public static final LogType DEBUG = new LogType();
-  public static final LogType VERBOSE_DEBUG = new LogType();
-  public static final LogType GTLF = new LogType();
-  public static final LogType COMPARISON = new LogType();
-  public static final LogType COMPOSITE_OUTPUT = new LogType();
-  
-  private LogType(){}
-  
-  public String toString()
-  {
-  	if (this == STANDARD) return "standard log";
-  	else if (this == DEBUG) return "debug log";
-  	else if (this == VERBOSE_DEBUG) return "verbose debug log";
-  	else if (this == GTLF) return "gtlf log";
-  	else if (this == COMPARISON) return "comparison log";
-  	else if (this == COMPOSITE_OUTPUT) return "composite-output log";
-  	else return "you will never see this";
-  }
-}
+package org.apache.beehive.test.tools.tch.logger;
+
+/**
+ */
+public class LogType
+{
+  public static final LogType STANDARD = new LogType();
+  public static final LogType DEBUG = new LogType();
+  public static final LogType VERBOSE_DEBUG = new LogType();
+  public static final LogType GTLF = new LogType();
+  public static final LogType COMPARISON = new LogType();
+  public static final LogType COMPOSITE_OUTPUT = new LogType();
+  
+  private LogType(){}
+  
+  public String toString()
+  {
+  	if (this == STANDARD) return "standard log";
+  	else if (this == DEBUG) return "debug log";
+  	else if (this == VERBOSE_DEBUG) return "verbose debug log";
+  	else if (this == GTLF) return "gtlf log";
+  	else if (this == COMPARISON) return "comparison log";
+  	else if (this == COMPOSITE_OUTPUT) return "composite-output log";
+  	else return "you will never see this";
+  }
+}

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LogType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/Logger.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/Logger.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/Logger.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/Logger.java Fri Aug 12 08:12:28 2005
@@ -1,52 +1,52 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-import java.text.SimpleDateFormat;
-import java.util.Map;
-
-import org.apache.beehive.test.tools.tch.util.TchConstants;
-import org.apache.beehive.test.tools.tch.util.TestResult;
-
-/**
- * Logger interface.
- * <p>
- * <blockquote><pre>
- * The lifecycle is as below:
-    newInstance()
-    init (Map)
-    init (Map)
-    ...
-    open ()
-    logInit (Map)
-    log (TestResult)
-    log (TestResult)
-    ...
-    close ()
- * </pre></blockquote>
- * 
- * @version 1.0, Mar 3, 2001
- */
-public interface Logger 
-  extends TchConstants
-{ 
-
-  public void setDateFormat(SimpleDateFormat d);
-	
-  /** sets the minimum logLevel of this logger.  */
-  public void setMinLogLevel (int logLevel);
-  
-  /** can be called multiple times */
-  public void init (Map m);
-  
-  /** open the logger */
-  public void open (); 
-  
-  /** The map here can contain an entry for EXPECTED_NUM_TESTS, among other information */
-  public void logInit (Map m);
-  
-  /** log a testresult */
-  public void log (TestResult res); 
-
-  /** close the logger */
-  public void close () ;
-}
-
+package org.apache.beehive.test.tools.tch.logger;
+
+import java.text.SimpleDateFormat;
+import java.util.Map;
+
+import org.apache.beehive.test.tools.tch.util.TchConstants;
+import org.apache.beehive.test.tools.tch.util.TestResult;
+
+/**
+ * Logger interface.
+ * <p>
+ * <blockquote><pre>
+ * The lifecycle is as below:
+    newInstance()
+    init (Map)
+    init (Map)
+    ...
+    open ()
+    logInit (Map)
+    log (TestResult)
+    log (TestResult)
+    ...
+    close ()
+ * </pre></blockquote>
+ * 
+ * @version 1.0, Mar 3, 2001
+ */
+public interface Logger 
+  extends TchConstants
+{ 
+
+  public void setDateFormat(SimpleDateFormat d);
+	
+  /** sets the minimum logLevel of this logger.  */
+  public void setMinLogLevel (int logLevel);
+  
+  /** can be called multiple times */
+  public void init (Map m);
+  
+  /** open the logger */
+  public void open (); 
+  
+  /** The map here can contain an entry for EXPECTED_NUM_TESTS, among other information */
+  public void logInit (Map m);
+  
+  /** log a testresult */
+  public void log (TestResult res); 
+
+  /** close the logger */
+  public void close () ;
+}
+

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/Logger.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerConfiguration.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerConfiguration.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerConfiguration.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerConfiguration.java Fri Aug 12 08:12:28 2005
@@ -1,218 +1,218 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import org.apache.beehive.test.tools.tch.core.AntProperties;
-import org.apache.beehive.test.tools.tch.util.xml.DomUtils;
-import org.apache.beehive.test.tools.tch.util.xml.NestedXMLProcessingException;
-import org.apache.beehive.test.tools.tch.util.xml.NestedXMLProcessingRuntimeException;
-
-/**
- * In memory representation of xml configuration file
- * 
- */
-public class LoggerConfiguration
-{
-  public static final String LOGGER_ROOT_ELEMENT = "loggers",
-    LOGGER_ELEMENT_NAME = "logger",
-    CLASSNAME_ATTR = "classname",
-    STANDARD_LOG_VAL = "standard",
-    VERBOSE_LOG_VAL = "verbose-debug",
-    COMPOSITE_LOG_VAL = "composite-output",
-    GTLF_LOG_VAL = "gtlf",
-    JAR_LOG_VAL = "jar",
-	COMPARISON_LOG_VAL = "clf",
-	CONSOLE_VAL = "console",
-	FILE_VAL = "file",
-    PROPERTY_ELEMENT = "property",
-    NAME_ATTR = "name",
-    VALUE_ATTR = "value",
-    LOG_TYPE_ATTR = "type",
-    LOG_DEST_ATTR = "dest",
-    LOG_TYPE_DEFAULT = STANDARD_LOG_VAL,
-    LOG_DEST_DEFAULT = FILE_VAL;
-
-  private static LoggerConfiguration conf = null;
-  
-  private Collection loggers = new HashSet();
-  private File confFile = null;
-
-  public static synchronized LoggerConfiguration getLoggerConfiguration(File f) throws ConfigurationFileNotFoundException
-  {
-    if (conf == null)
-    {
-      conf = new LoggerConfiguration();
-      conf.init(f);
-    }
-    return conf;
-  }
-  
-  public Collection getLoggerEntries()
-  {
-  	return Collections.unmodifiableCollection(loggers);
-  }
-  
-  public String toString()
-  {
-  	return loggers.toString();
-  }
-
-  private LoggerConfiguration(){}
-
-  private void init(File f) throws ConfigurationFileNotFoundException
-  {
-  	Document root = loadRoot(f);
-    parseLoggers(root);
-  }
-
-  private void parseLoggers(Document doc)
-  {
-    Element root =
-      (Element)doc.getElementsByTagName(LOGGER_ROOT_ELEMENT).item(0);
-    NodeList loggers =
-      root.getElementsByTagName(LOGGER_ELEMENT_NAME);
-    for (int i = 0; i < loggers.getLength(); i++)
-    {
-      Element loggerNode = (Element)loggers.item(i);
-      String classname = loggerNode.getAttribute(CLASSNAME_ATTR);
-      String logType = loggerNode.getAttribute(LOG_TYPE_ATTR);
-      if (logType == null || logType.trim().length() == 0)
-        logType = LOG_TYPE_DEFAULT;
-      String logDest = loggerNode.getAttribute(LOG_DEST_ATTR);
-      if (logDest == null || logDest.trim().length() == 0)
-        logDest = LOG_DEST_DEFAULT;
-      LoggerEntry entry = new LoggerEntry(classname, getLogType(logType), getLogDestination(logDest));
-      // get nested properties
-      NodeList properyNodes = loggerNode.getElementsByTagName(PROPERTY_ELEMENT);
-      for (int j = 0; j < properyNodes.getLength(); j++)
-      {
-        Element propertyNode = (Element)properyNodes.item(j);
-        String name  = propertyNode.getAttribute(NAME_ATTR);
-        String value = propertyNode.getAttribute(VALUE_ATTR);
-        entry.addProperty(name, value);	
-      }
-      registerLogger(entry);
-    }
-  }
-  
-  private void registerLogger(LoggerEntry entry)
-  {
-  	loggers.add(entry);
-  }
-
-  private Document loadRoot(File f) throws ConfigurationFileNotFoundException
-  {
-  	if (!f.exists())
-  	  throw new ConfigurationFileNotFoundException(f.getAbsolutePath());
-    try
-    {
-      return DomUtils.instantiateDom(f);
-    }
-    catch (NestedXMLProcessingException ex)
-    {
-      // parsing error
-      throw new NestedXMLProcessingRuntimeException(ex);
-    }
-  }
-  
-  private LogDestination getLogDestination(String destAttr)
-  {
-  	if (destAttr.equals(FILE_VAL))
-  	  return LogDestination.FILE;
-  	else if (destAttr.equals(CONSOLE_VAL))
-  	  return LogDestination.CONSOLE;
-  	else if (destAttr.equals(JAR_LOG_VAL))
-  	  return LogDestination.JAR;
-  	throw new RuntimeException("Unknown log-dest: " + destAttr);
-  }
-  
-  private LogType getLogType(String typeAttr)
-  {
-  	if (typeAttr.equals(STANDARD_LOG_VAL))
-  	  return LogType.STANDARD;
-  	else if  (typeAttr.equals(GTLF_LOG_VAL))
-  	  return LogType.GTLF;
-  	else if (typeAttr.equals(VERBOSE_LOG_VAL))
-  	  return LogType.VERBOSE_DEBUG;
-  	else if (typeAttr.equals(COMPARISON_LOG_VAL))
-  	  return LogType.COMPARISON;
-  	else if (typeAttr.equals(COMPOSITE_LOG_VAL))
-  	  return LogType.COMPOSITE_OUTPUT;
-  	else throw new RuntimeException("Unknown log-type: " + typeAttr);
-  }
-  
-  public static class ConfigurationFileNotFoundException extends Exception
-  {
-  	public ConfigurationFileNotFoundException(String filename)
-  	{
-  	  super("Could not find logger configuration file: " + filename);
-  	}
-  }
-
-  public static class LoggerEntry
-  {
-    private String className = null;
-    private Map params = null;
-    private LogType type = null;
-    private LogDestination dest = LogDestination.FILE;
-    
-    public LoggerEntry(String classname, LogType inType, LogDestination inDest)
-    {
-      this(classname, inType, inDest, new HashMap());
-    }
-    
-    public LoggerEntry(String inClassname, LogType inType, LogDestination inDest, Map inParams)
-    {
-      className = inClassname;
-      params = inParams;
-      type = inType;
-      dest = inDest;
-    }
-    
-    public void addProperty(String name, String value)
-    {
-      params.put(name, value);
-    }
-    
-    public Map getProperties()
-    {
-      return params;
-    }
-    
-    public String getClassname()
-    {
-      return className;
-    }
-    
-    public LogType getType()
-    {
-      return type;
-    }
-    
-    public LogDestination getDestination()
-    {
-      return dest;
-    }
-    
-    public String toString()
-    {
-      return "classname: " + className + "\n" +
-        "type: " + type + "\n" +
-        "dest: " + dest + "\n" +
-        "params: " + params;
-    }
-  }
-
-}
-
-
-
+package org.apache.beehive.test.tools.tch.logger;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.apache.beehive.test.tools.tch.core.AntProperties;
+import org.apache.beehive.test.tools.tch.util.xml.DomUtils;
+import org.apache.beehive.test.tools.tch.util.xml.NestedXMLProcessingException;
+import org.apache.beehive.test.tools.tch.util.xml.NestedXMLProcessingRuntimeException;
+
+/**
+ * In memory representation of xml configuration file
+ * 
+ */
+public class LoggerConfiguration
+{
+  public static final String LOGGER_ROOT_ELEMENT = "loggers",
+    LOGGER_ELEMENT_NAME = "logger",
+    CLASSNAME_ATTR = "classname",
+    STANDARD_LOG_VAL = "standard",
+    VERBOSE_LOG_VAL = "verbose-debug",
+    COMPOSITE_LOG_VAL = "composite-output",
+    GTLF_LOG_VAL = "gtlf",
+    JAR_LOG_VAL = "jar",
+	COMPARISON_LOG_VAL = "clf",
+	CONSOLE_VAL = "console",
+	FILE_VAL = "file",
+    PROPERTY_ELEMENT = "property",
+    NAME_ATTR = "name",
+    VALUE_ATTR = "value",
+    LOG_TYPE_ATTR = "type",
+    LOG_DEST_ATTR = "dest",
+    LOG_TYPE_DEFAULT = STANDARD_LOG_VAL,
+    LOG_DEST_DEFAULT = FILE_VAL;
+
+  private static LoggerConfiguration conf = null;
+  
+  private Collection loggers = new HashSet();
+  private File confFile = null;
+
+  public static synchronized LoggerConfiguration getLoggerConfiguration(File f) throws ConfigurationFileNotFoundException
+  {
+    if (conf == null)
+    {
+      conf = new LoggerConfiguration();
+      conf.init(f);
+    }
+    return conf;
+  }
+  
+  public Collection getLoggerEntries()
+  {
+  	return Collections.unmodifiableCollection(loggers);
+  }
+  
+  public String toString()
+  {
+  	return loggers.toString();
+  }
+
+  private LoggerConfiguration(){}
+
+  private void init(File f) throws ConfigurationFileNotFoundException
+  {
+  	Document root = loadRoot(f);
+    parseLoggers(root);
+  }
+
+  private void parseLoggers(Document doc)
+  {
+    Element root =
+      (Element)doc.getElementsByTagName(LOGGER_ROOT_ELEMENT).item(0);
+    NodeList loggers =
+      root.getElementsByTagName(LOGGER_ELEMENT_NAME);
+    for (int i = 0; i < loggers.getLength(); i++)
+    {
+      Element loggerNode = (Element)loggers.item(i);
+      String classname = loggerNode.getAttribute(CLASSNAME_ATTR);
+      String logType = loggerNode.getAttribute(LOG_TYPE_ATTR);
+      if (logType == null || logType.trim().length() == 0)
+        logType = LOG_TYPE_DEFAULT;
+      String logDest = loggerNode.getAttribute(LOG_DEST_ATTR);
+      if (logDest == null || logDest.trim().length() == 0)
+        logDest = LOG_DEST_DEFAULT;
+      LoggerEntry entry = new LoggerEntry(classname, getLogType(logType), getLogDestination(logDest));
+      // get nested properties
+      NodeList properyNodes = loggerNode.getElementsByTagName(PROPERTY_ELEMENT);
+      for (int j = 0; j < properyNodes.getLength(); j++)
+      {
+        Element propertyNode = (Element)properyNodes.item(j);
+        String name  = propertyNode.getAttribute(NAME_ATTR);
+        String value = propertyNode.getAttribute(VALUE_ATTR);
+        entry.addProperty(name, value);	
+      }
+      registerLogger(entry);
+    }
+  }
+  
+  private void registerLogger(LoggerEntry entry)
+  {
+  	loggers.add(entry);
+  }
+
+  private Document loadRoot(File f) throws ConfigurationFileNotFoundException
+  {
+  	if (!f.exists())
+  	  throw new ConfigurationFileNotFoundException(f.getAbsolutePath());
+    try
+    {
+      return DomUtils.instantiateDom(f);
+    }
+    catch (NestedXMLProcessingException ex)
+    {
+      // parsing error
+      throw new NestedXMLProcessingRuntimeException(ex);
+    }
+  }
+  
+  private LogDestination getLogDestination(String destAttr)
+  {
+  	if (destAttr.equals(FILE_VAL))
+  	  return LogDestination.FILE;
+  	else if (destAttr.equals(CONSOLE_VAL))
+  	  return LogDestination.CONSOLE;
+  	else if (destAttr.equals(JAR_LOG_VAL))
+  	  return LogDestination.JAR;
+  	throw new RuntimeException("Unknown log-dest: " + destAttr);
+  }
+  
+  private LogType getLogType(String typeAttr)
+  {
+  	if (typeAttr.equals(STANDARD_LOG_VAL))
+  	  return LogType.STANDARD;
+  	else if  (typeAttr.equals(GTLF_LOG_VAL))
+  	  return LogType.GTLF;
+  	else if (typeAttr.equals(VERBOSE_LOG_VAL))
+  	  return LogType.VERBOSE_DEBUG;
+  	else if (typeAttr.equals(COMPARISON_LOG_VAL))
+  	  return LogType.COMPARISON;
+  	else if (typeAttr.equals(COMPOSITE_LOG_VAL))
+  	  return LogType.COMPOSITE_OUTPUT;
+  	else throw new RuntimeException("Unknown log-type: " + typeAttr);
+  }
+  
+  public static class ConfigurationFileNotFoundException extends Exception
+  {
+  	public ConfigurationFileNotFoundException(String filename)
+  	{
+  	  super("Could not find logger configuration file: " + filename);
+  	}
+  }
+
+  public static class LoggerEntry
+  {
+    private String className = null;
+    private Map params = null;
+    private LogType type = null;
+    private LogDestination dest = LogDestination.FILE;
+    
+    public LoggerEntry(String classname, LogType inType, LogDestination inDest)
+    {
+      this(classname, inType, inDest, new HashMap());
+    }
+    
+    public LoggerEntry(String inClassname, LogType inType, LogDestination inDest, Map inParams)
+    {
+      className = inClassname;
+      params = inParams;
+      type = inType;
+      dest = inDest;
+    }
+    
+    public void addProperty(String name, String value)
+    {
+      params.put(name, value);
+    }
+    
+    public Map getProperties()
+    {
+      return params;
+    }
+    
+    public String getClassname()
+    {
+      return className;
+    }
+    
+    public LogType getType()
+    {
+      return type;
+    }
+    
+    public LogDestination getDestination()
+    {
+      return dest;
+    }
+    
+    public String toString()
+    {
+      return "classname: " + className + "\n" +
+        "type: " + type + "\n" +
+        "dest: " + dest + "\n" +
+        "params: " + params;
+    }
+  }
+
+}
+
+
+

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerConfiguration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerFactory.java
URL: http://svn.apache.org/viewcvs/beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerFactory.java?rev=232310&r1=232309&r2=232310&view=diff
==============================================================================
--- beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerFactory.java (original)
+++ beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerFactory.java Fri Aug 12 08:12:28 2005
@@ -1,216 +1,216 @@
-package org.apache.beehive.test.tools.tch.logger;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.beehive.test.tools.tch.util.TchConstants;
-import org.apache.beehive.test.tools.tch.util.gtlf.GTLFProperties;
-
-public class LoggerFactory
-{
-  private static String STANDARD_LOGGER_CLASSNAME =
-    "org.apache.beehive.test.tools.tch.logger.StandardLogger",
-    DEBUG_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.DebugLogger",
-    VERBOSE_DEBUG_LOGGER_CLASSNAME =
-      "org.apache.beehive.test.tools.tch.logger.VerboseDebugLogger",
-    COMPARISON_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.ComparisonLogger",
-    COMPOSITE_LOGGER_CLASSNAME =
-      "org.apache.beehive.test.tools.tch.logger.ExecutionOutputLogger",
-    GTLF_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.GTLFLogger",
-    THREADDUMP_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.ThreadDumpLogger",
-    STATS_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.StatsLogger",
-    JAR_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.JARLogger";
-
-  private String baseFileName = "tch";
-
-  private String gtlfFileExtension = "xml";
-
-  private CompositeLogger compositeLogger = new CompositeLogger();
-
-  public LoggerFactory(String inBaseFilename)
-  {
-    this(new File("."), inBaseFilename);
-  }
-
-  public LoggerFactory(File inBaseDir, String inBaseFileName)
-  {
-    inBaseDir.mkdirs();
-    baseFileName = new File(inBaseDir, inBaseFileName).getAbsolutePath();
-  }
-
-  public Logger getLogger()
-  {
-    return compositeLogger;
-  }
-
-  public void addCustomLogger(String classname, String logFileExtension)
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      logFileExtension);
-    addLogger(classname, props, LogDestination.FILE);
-  }
-
-  public void addLogger(
-    String classname,
-    Map props,
-    LogDestination logDestination)
-  {
-    addLogger(classname, props, null, logDestination);
-  }
-
-  public void addLogger(
-    String classname,
-    Map props,
-    LogType logType,
-    LogDestination logDestination)
-  {
-    Map defaults = new HashMap();
-    defaults.put(
-      TchConstants.PARAM_PREFIX + FileLogger.BASE_FILENAME_KEY,
-      baseFileName);
-
-    // special props for the GTLF logger
-    if (logType != null && logType == LogType.GTLF)
-    {
-      props.putAll(GTLFProperties.getTestLogAttrsMap());
-      props.putAll(GTLFProperties.getHeaderAttrsMap());
-      props.putAll(GTLFProperties.getEnvironmentMap());
-    }
-
-    if (props != null)
-      defaults.putAll(props);
-
-    Logger logger = null;
-    if (logDestination == LogDestination.FILE)
-    {
-      logger = new FileLogger();
-      defaults.put(
-        TchConstants.PARAM_PREFIX + FileLogger.PRINTWRITER_CLASSNAME_KEY,
-        classname);
-    }
-    else if (logDestination == LogDestination.CONSOLE)
-    {
-      logger = new StdoutLogger();
-      defaults.put(
-        TchConstants.PARAM_PREFIX + StdoutLogger.PRINTWRITER_CLASSNAME_KEY,
-        classname);
-    }
-    else if (logDestination == LogDestination.JAR)
-    {
-      // this logger is very specific, 
-      // so it does not take a class name
-      // (replication ant build file logger)
-      try
-      {
-        logger =
-          (Logger)Class
-            .forName(
-              classname,
-              true,
-              Thread.currentThread().getContextClassLoader())
-            .newInstance();
-      }
-      catch (Exception ex)
-      {
-        throw new LoggerRuntimeException(ex);
-      }
-    }
-    logger.init(defaults);
-    compositeLogger.add(logger);
-  }
-
-  public void addStandardLogger()
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      "log");
-    addLogger(STANDARD_LOGGER_CLASSNAME, props, LogDestination.FILE);
-  }
-
-  public void addDebugLogger()
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      "debug");
-    addLogger(DEBUG_LOGGER_CLASSNAME, props, LogDestination.FILE);
-  }
-
-  public void addVerboseDebugLogger()
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      "debug-all");
-    addLogger(VERBOSE_DEBUG_LOGGER_CLASSNAME, props, LogDestination.FILE);
-  }
-
-  public void addComparisonLogger()
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      "clf");
-    addLogger(COMPARISON_LOGGER_CLASSNAME, props, LogDestination.FILE);
-  }
-
-  public void addCompositeLogger()
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      "cout");
-    addLogger(COMPARISON_LOGGER_CLASSNAME, props, LogDestination.FILE);
-  }
-
-  public void addThreadDumpLogger()
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      "td");
-    addLogger(THREADDUMP_LOGGER_CLASSNAME, props, LogDestination.FILE);
-  }
-
-  public void addGTLFLogger()
-  {
-    Map props = new HashMap();
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      gtlfFileExtension);
-    addLogger(GTLF_LOGGER_CLASSNAME, props, LogType.GTLF, LogDestination.FILE);
-  }
-
-  public void addJARLogger()
-  {
-    Map props = new HashMap(1);
-    props.put(
-      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
-      "zip");
-    addLogger(JAR_LOGGER_CLASSNAME, props, LogDestination.JAR);
-  }
-
-  public void addStdoutLogger()
-  {
-    addLogger(STANDARD_LOGGER_CLASSNAME, null, LogDestination.CONSOLE);
-  }
-
-  public void addStdoutStatsLogger()
-  {
-    addLogger(STATS_LOGGER_CLASSNAME, null, LogDestination.CONSOLE);
-  }
-
-  /**
-   * @param string. The extension that will be used for the GTLF file,
-   * default is ".xml". 
-   */
-  public void setGtlfFileExtension(String string)
-  {
-    gtlfFileExtension = string;
-  }
-
-}
+package org.apache.beehive.test.tools.tch.logger;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.beehive.test.tools.tch.util.TchConstants;
+import org.apache.beehive.test.tools.tch.util.gtlf.GTLFProperties;
+
+public class LoggerFactory
+{
+  private static String STANDARD_LOGGER_CLASSNAME =
+    "org.apache.beehive.test.tools.tch.logger.StandardLogger",
+    DEBUG_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.DebugLogger",
+    VERBOSE_DEBUG_LOGGER_CLASSNAME =
+      "org.apache.beehive.test.tools.tch.logger.VerboseDebugLogger",
+    COMPARISON_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.ComparisonLogger",
+    COMPOSITE_LOGGER_CLASSNAME =
+      "org.apache.beehive.test.tools.tch.logger.ExecutionOutputLogger",
+    GTLF_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.GTLFLogger",
+    THREADDUMP_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.ThreadDumpLogger",
+    STATS_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.StatsLogger",
+    JAR_LOGGER_CLASSNAME = "org.apache.beehive.test.tools.tch.logger.JARLogger";
+
+  private String baseFileName = "tch";
+
+  private String gtlfFileExtension = "xml";
+
+  private CompositeLogger compositeLogger = new CompositeLogger();
+
+  public LoggerFactory(String inBaseFilename)
+  {
+    this(new File("."), inBaseFilename);
+  }
+
+  public LoggerFactory(File inBaseDir, String inBaseFileName)
+  {
+    inBaseDir.mkdirs();
+    baseFileName = new File(inBaseDir, inBaseFileName).getAbsolutePath();
+  }
+
+  public Logger getLogger()
+  {
+    return compositeLogger;
+  }
+
+  public void addCustomLogger(String classname, String logFileExtension)
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      logFileExtension);
+    addLogger(classname, props, LogDestination.FILE);
+  }
+
+  public void addLogger(
+    String classname,
+    Map props,
+    LogDestination logDestination)
+  {
+    addLogger(classname, props, null, logDestination);
+  }
+
+  public void addLogger(
+    String classname,
+    Map props,
+    LogType logType,
+    LogDestination logDestination)
+  {
+    Map defaults = new HashMap();
+    defaults.put(
+      TchConstants.PARAM_PREFIX + FileLogger.BASE_FILENAME_KEY,
+      baseFileName);
+
+    // special props for the GTLF logger
+    if (logType != null && logType == LogType.GTLF)
+    {
+      props.putAll(GTLFProperties.getTestLogAttrsMap());
+      props.putAll(GTLFProperties.getHeaderAttrsMap());
+      props.putAll(GTLFProperties.getEnvironmentMap());
+    }
+
+    if (props != null)
+      defaults.putAll(props);
+
+    Logger logger = null;
+    if (logDestination == LogDestination.FILE)
+    {
+      logger = new FileLogger();
+      defaults.put(
+        TchConstants.PARAM_PREFIX + FileLogger.PRINTWRITER_CLASSNAME_KEY,
+        classname);
+    }
+    else if (logDestination == LogDestination.CONSOLE)
+    {
+      logger = new StdoutLogger();
+      defaults.put(
+        TchConstants.PARAM_PREFIX + StdoutLogger.PRINTWRITER_CLASSNAME_KEY,
+        classname);
+    }
+    else if (logDestination == LogDestination.JAR)
+    {
+      // this logger is very specific, 
+      // so it does not take a class name
+      // (replication ant build file logger)
+      try
+      {
+        logger =
+          (Logger)Class
+            .forName(
+              classname,
+              true,
+              Thread.currentThread().getContextClassLoader())
+            .newInstance();
+      }
+      catch (Exception ex)
+      {
+        throw new LoggerRuntimeException(ex);
+      }
+    }
+    logger.init(defaults);
+    compositeLogger.add(logger);
+  }
+
+  public void addStandardLogger()
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      "log");
+    addLogger(STANDARD_LOGGER_CLASSNAME, props, LogDestination.FILE);
+  }
+
+  public void addDebugLogger()
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      "debug");
+    addLogger(DEBUG_LOGGER_CLASSNAME, props, LogDestination.FILE);
+  }
+
+  public void addVerboseDebugLogger()
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      "debug-all");
+    addLogger(VERBOSE_DEBUG_LOGGER_CLASSNAME, props, LogDestination.FILE);
+  }
+
+  public void addComparisonLogger()
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      "clf");
+    addLogger(COMPARISON_LOGGER_CLASSNAME, props, LogDestination.FILE);
+  }
+
+  public void addCompositeLogger()
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      "cout");
+    addLogger(COMPARISON_LOGGER_CLASSNAME, props, LogDestination.FILE);
+  }
+
+  public void addThreadDumpLogger()
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      "td");
+    addLogger(THREADDUMP_LOGGER_CLASSNAME, props, LogDestination.FILE);
+  }
+
+  public void addGTLFLogger()
+  {
+    Map props = new HashMap();
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      gtlfFileExtension);
+    addLogger(GTLF_LOGGER_CLASSNAME, props, LogType.GTLF, LogDestination.FILE);
+  }
+
+  public void addJARLogger()
+  {
+    Map props = new HashMap(1);
+    props.put(
+      TchConstants.PARAM_PREFIX + FileLogger.FILE_EXTENSION_KEY,
+      "zip");
+    addLogger(JAR_LOGGER_CLASSNAME, props, LogDestination.JAR);
+  }
+
+  public void addStdoutLogger()
+  {
+    addLogger(STANDARD_LOGGER_CLASSNAME, null, LogDestination.CONSOLE);
+  }
+
+  public void addStdoutStatsLogger()
+  {
+    addLogger(STATS_LOGGER_CLASSNAME, null, LogDestination.CONSOLE);
+  }
+
+  /**
+   * @param string. The extension that will be used for the GTLF file,
+   * default is ".xml". 
+   */
+  public void setGtlfFileExtension(String string)
+  {
+    gtlfFileExtension = string;
+  }
+
+}

Propchange: beehive/trunk/controls/test/tools/tch/src/java/org/apache/beehive/test/tools/tch/logger/LoggerFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native