mhoyt       2005/04/07 00:03:06

  Modified:    c/Projects/Win32/VC7.1/Performance perf.vcproj
               c/Tests/Performance perf.cpp
  Added:       c/Tests/Performance Logger.cpp Logger.hpp Parameters.cpp
                        Parameters.hpp TestHarness.cpp TestHarness.hpp
                        Timer.hpp Utils.cpp Utils.hpp XalanCProcessor.cpp
                        XalanCProcessor.hpp comparereport.xsl config.xml
                        report.xsl
  Log:
  Initial implementation of alternate performance testing tool
  
  Revision  Changes    Path
  1.3       +33 -0     xml-xalan/c/Projects/Win32/VC7.1/Performance/perf.vcproj
  
  Index: perf.vcproj
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/Projects/Win32/VC7.1/Performance/perf.vcproj,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- perf.vcproj       1 Dec 2004 20:33:01 -0000       1.2
  +++ perf.vcproj       7 Apr 2005 07:03:05 -0000       1.3
  @@ -203,6 +203,18 @@
        </References>
        <Files>
                <File
  +                     RelativePath="..\..\..\..\Tests\Performance\Logger.cpp">
  +             </File>
  +             <File
  +                     RelativePath="..\..\..\..\Tests\Performance\Logger.hpp">
  +             </File>
  +             <File
  +                     
RelativePath="..\..\..\..\Tests\Performance\Parameters.cpp">
  +             </File>
  +             <File
  +                     
RelativePath="..\..\..\..\Tests\Performance\Parameters.hpp">
  +             </File>
  +             <File
                        RelativePath="..\..\..\..\Tests\Performance\perf.cpp">
                        <FileConfiguration
                                Name="Release|Win32">
  @@ -223,6 +235,27 @@
                                        
ObjectFile="$(IntDir)/$(InputName)1.obj"/>
                        </FileConfiguration>
                </File>
  +             <File
  +                     
RelativePath="..\..\..\..\Tests\Performance\TestHarness.cpp">
  +             </File>
  +             <File
  +                     
RelativePath="..\..\..\..\Tests\Performance\TestHarness.hpp">
  +             </File>
  +             <File
  +                     RelativePath="..\..\..\..\Tests\Performance\Timer.hpp">
  +             </File>
  +             <File
  +                     RelativePath="..\..\..\..\Tests\Performance\Utils.cpp">
  +             </File>
  +             <File
  +                     RelativePath="..\..\..\..\Tests\Performance\Utils.hpp">
  +             </File>
  +             <File
  +                     
RelativePath="..\..\..\..\Tests\Performance\XalanCProcessor.cpp">
  +             </File>
  +             <File
  +                     
RelativePath="..\..\..\..\Tests\Performance\XalanCProcessor.hpp">
  +             </File>
        </Files>
        <Globals>
        </Globals>
  
  
  
  1.43      +212 -486  xml-xalan/c/Tests/Performance/perf.cpp
  
  Index: perf.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/Tests/Performance/perf.cpp,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- perf.cpp  1 Dec 2004 20:33:01 -0000       1.42
  +++ perf.cpp  7 Apr 2005 07:03:05 -0000       1.43
  @@ -18,558 +18,284 @@
   #include <xalanc/Include/PlatformDefinitions.hpp>
   
   
  -
  -#include <cstdio>
  -
  -#if defined(XALAN_CLASSIC_IOSTREAMS)
  -#include <iostream.h>
  -#else
   #include <iostream>
  -#endif
   
  -// This is here for memory leak testing.
  -#if !defined(NDEBUG) && defined(_MSC_VER)
  -#include <crtdbg.h>
  -#endif
   
   
   #include <xercesc/util/PlatformUtils.hpp>
   
   
   
  -#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  -#include <xalanc/PlatformSupport/XalanFileOutputStream.hpp>
  -#include <xalanc/PlatformSupport/XalanOutputStreamPrintWriter.hpp>
  -
  -#include <xalanc/XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
  -#include <xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp>
  -
  -#include <xalanc/XPath/XObjectFactoryDefault.hpp>
  -#include <xalanc/XPath/XPathFactoryDefault.hpp>
  -
  -#include <xalanc/XSLT/StylesheetConstructionContextDefault.hpp>
  -#include <xalanc/XSLT/StylesheetExecutionContextDefault.hpp>
  -#include <xalanc/XSLT/StylesheetRoot.hpp>
  -#include <xalanc/XSLT/XSLTEngineImpl.hpp>
  -#include <xalanc/XSLT/XSLTInit.hpp>
  -#include <xalanc/XSLT/XSLTInputSource.hpp>
  -#include <xalanc/XSLT/XSLTProcessorEnvSupportDefault.hpp>
  -#include <xalanc/XSLT/XSLTResultTarget.hpp>  
  +#include <xalanc/XalanTransformer/XalanTransformer.hpp>
   
  -#include <xalanc/Harness/XalanXMLFileReporter.hpp>
  -#include <xalanc/Harness/XalanFileUtility.hpp>
   
   
  +#include <xalanc/XalanDOM/XalanDOMString.hpp>
   
  -XALAN_USING_STD(cerr)
  -XALAN_USING_STD(cout)
  -XALAN_USING_STD(endl)
   
   
  +#include <xalanc/Harness/XalanXMLFileReporter.hpp>
  +#include <xalanc/Harness/XalanFileUtility.hpp>
   
  -const char* const    excludeStylesheets[] =
  -{
  -     "large-evans_large.xsl",
  -     0
  -};
   
   
  +#include "Parameters.hpp"
  +#include "TestHarness.hpp"
  +#include "XalanCProcessor.hpp"
  +#include "Logger.hpp"
  +#include "Utils.hpp"
   
  -// Just hoist everything...
  -XALAN_CPP_NAMESPACE_USE
   
   
  +XALAN_USING_STD(cout);
  +XALAN_USING_STD(cerr);
  +XALAN_USING_STD(endl);
   
  -inline bool
  -checkForExclusion(const XalanDOMString&              currentFile)
  -{
  -     for (int i=0; excludeStylesheets[i] != 0; i++)
  -     {       
  -             if (equals(currentFile, XalanDOMString(excludeStylesheets[i])))
  -             {
  -                     return true;
  -             }
  -     }
   
  -     return false;
  -}
  +XALAN_USING_XERCES(XMLPlatformUtils)
   
   
   
  -inline StylesheetRoot*
  -processStylesheet(
  -                     const XalanDOMString&                   theFileName,
  -                     XSLTProcessor&                                  
theProcessor,
  -                     StylesheetConstructionContext&  theConstructionContext)
  -{
  -     const XSLTInputSource   theInputSource(theFileName);
  +XALAN_USING_XALAN(XalanTransformer)
  +XALAN_USING_XALAN(XalanDOMString)
  +XALAN_USING_XALAN(XalanXMLFileReporter)
  +XALAN_USING_XALAN(XalanFileUtility)
   
  -     return theProcessor.processStylesheet(theInputSource, 
theConstructionContext);
  -}
   
   
  -
  -inline XalanNode*
  -parseSourceDocument(
  -                     const XalanDOMString&   theFileName,
  -                     XSLTProcessor&                  theProcessor)
  +void usage()
   {
  -     const XSLTInputSource   theInputSource(theFileName);
  -
  -     return theProcessor.getSourceTreeFromInput(theInputSource);
  +    cerr << "Usage: perf"
  +         << " [options]"
  +         << " -test [test directory ]"
  +         << " -result [result directory ]"
  +              << " -report [report directory ]"
  +              << " configfile" << endl
  +         << "Options:" << endl
  +         << "        -?    Display this message" << endl;
   }
   
   
   
  -inline double
  -calculateElapsedTime(
  -                     clock_t         theStartTime,
  -                     clock_t         theEndTime)
  +void generateReports(
  +             Parameters&                             params,
  +             const XalanDOMString&   reportFile,
  +             Logger&                                 logger)
   {
  -     return double(theEndTime - theStartTime) / CLOCKS_PER_SEC * 1000.0;
  -}
  -
  +     XalanTransformer transformer;
   
  +     // report XSL file
  +     XalanDOMString reportFileXSL = params.getReportDirectory();
  +     reportFileXSL += XalanDOMString("report.xsl");
   
  -inline double
  -calculateAvgTime(
  -                     clock_t         accTime,
  -                     long            theIterationCount)
  -{
  -     assert(theIterationCount > 0);
  -
  -     return double(accTime) / theIterationCount;
  -}
  +     // html result
  +     XalanDOMString htmlReport = params.getResultDirectory();
  +     htmlReport += params.getResultFile();
  +     htmlReport += params.getUniqId();
  +     htmlReport += XalanDOMString(".html");
   
  +     if (checkFileExists(reportFileXSL))
  +     {
  +             if (transformer.transform(reportFile, reportFileXSL, 
htmlReport) < 0)
  +             {
  +                     logger.warning() 
  +                             << "Failed to generate HTML report: " 
  +                             << htmlReport.c_str()
  +                             << ", error: " 
  +                             << transformer.getLastError() << endl;
  +             }
  +             else
  +             {
  +                     logger.message() << "Generated HTML report: " << 
htmlReport.c_str() << endl;
  +             }
  +     }
  +     else
  +     {
  +             logger.warning()
  +                     << "Could not generate HTML report, stylesheet: "
  +                     << reportFileXSL.c_str()
  +                     << ", file not found" << endl;
  +     }
   
  +     XalanDOMString baselineFile = params.getBaselineDirectory();
  +     baselineFile += params.getBaselineFile();
   
  -inline double
  -calculateAverageElapsedTime( 
  -                     clock_t     theStartTime,
  -                     clock_t         theEndTime,
  -                     long            theIterationCount)
  -{
  -     assert(theIterationCount > 0);
  -
  -     return calculateElapsedTime(theStartTime, theEndTime) / 
theIterationCount;
  -}
  -
  -
  -
  -inline clock_t
  -transformWUnparsedSource(
  -                     const XalanDOMString&                           
theFileName,
  -                     XSLTProcessor&                                          
theProcessor,
  -                     const StylesheetRoot*                           
theStylesheetRoot,
  -                     XSLTResultTarget&                                       
theResults,
  -                     StylesheetExecutionContextDefault&  theExecutionContext)
  -{
  -     const XSLTInputSource   csSourceXML(c_wstr(theFileName));
  -
  -     theProcessor.setStylesheetRoot(theStylesheetRoot);
  -
  -     const clock_t startTime = clock();
  -
  -     theProcessor.process(csSourceXML, theResults, theExecutionContext);
  +     if (checkFileExists(baselineFile))
  +     {
  +             // comparison report XSL file
  +             XalanDOMString compareReportFileXSL = 
params.getReportDirectory();
  +             compareReportFileXSL += XalanDOMString("comparereport.xsl");
  +
  +             // html result
  +             XalanDOMString htmlCompareReport = params.getResultDirectory();
  +             htmlCompareReport += XalanDOMString("compare");
  +             htmlCompareReport += params.getResultFile();
  +             htmlCompareReport += params.getUniqId();
  +             htmlCompareReport += XalanDOMString(".html");
   
  -     return clock() - startTime;
  +             
transformer.setStylesheetParam(XalanDOMString("threshold"),params.getThreshold());
  +             transformer.setStylesheetParam(XalanDOMString("baseline"), 
baselineFile);
   
  +             if (checkFileExists(compareReportFileXSL))
  +             {
  +                     if (transformer.transform(reportFile, 
compareReportFileXSL, htmlCompareReport) < 0)
  +                     {
  +                             logger.warning() 
  +                                     << "Failed to generate HTML report: " 
  +                                     << htmlCompareReport.c_str()
  +                                     << ", error: " 
  +                                     << transformer.getLastError() << endl;
  +                     }
  +                     else
  +                     {
  +                             logger.message() << "Generated HTML report: " 
<< htmlCompareReport.c_str() << endl;
  +                     }
  +             }
  +             else
  +             {
  +                     logger.warning()
  +                             << "Could not generate HTML report, stylesheet: 
"
  +                             << compareReportFileXSL.c_str()
  +                             << ", file not found" << endl;
  +             }
  +     }
  +     else
  +     {
  +             logger.warning()
  +                     << "No baseline file found: "
  +                     << baselineFile.c_str() 
  +                     << endl;
  +     }
   }
   
   
  -
  -inline clock_t
  -transformWParsedSource(
  -                     XalanNode*                                              
        theParsedSource,
  -                     XSLTProcessor&                                          
theProcessor,
  -                     const StylesheetRoot*                           
theStylesheetRoot,
  -                     XSLTResultTarget&                                       
theResults,
  -                     StylesheetExecutionContextDefault&      
theExecutionContext)
  +int main(int argc, char* argv[])
   {
  -     // Put the parsed document into an XSLTInputSource, 
  -     // and set stylesheet root in the processor
  -     const XSLTInputSource   csSourceDocument(theParsedSource);
  -
  -     theProcessor.setStylesheetRoot(theStylesheetRoot);
  -
  -     const clock_t startTime = clock();
  -
  -     theProcessor.process(csSourceDocument, theResults, theExecutionContext);
  -     
  -     return clock() - startTime;
  -}
  +     XMLPlatformUtils::Initialize();
  +    XalanTransformer::initialize();
   
  +     Logger logger(cerr);
   
  +     if (argc < 2 ||
  +        XalanDOMString("-?").compare(XalanDOMString(argv[1])) == 0)
  +    {
  +        usage();
  +    }
  +    else
  +    { 
  +        XalanDOMString testDirectory;
  +        XalanDOMString resultDirectory;
  +             XalanDOMString reportDirectory;
  +        XalanDOMString runFileName;
  +
  +             // process command line parameters
  +        int i = 1;
  +        while (i < argc)
  +        {
  +            if (stricmp(argv[i],"-test") == 0)
  +            {
  +                ++i;
  +                if (i >= argc)
  +                {
  +                                     logger.error() << "Test directory 
missing" << endl;
  +                                     usage();
  +                    exit(1);
  +                }
  +                testDirectory.assign(argv[i]);
  +            }
  +            else if (stricmp(argv[i],"-result") == 0)
  +            {
  +                ++i;
  +                if (i >= argc)
  +                {
  +                    logger.error() << "Result directory missing" << endl;
  +                                     usage();
  +                                     exit(1);
  +                }
  +                resultDirectory.assign(argv[i]);
  +            }
  +                     else if (stricmp(argv[i],"-report") == 0)
  +            {
  +                ++i;
  +                if (i >= argc)
  +                {
  +                                     logger.error() << "Report directory 
missing" << endl;
  +                                     usage();
  +                                     exit(1);
  +                }
  +                reportDirectory.assign(argv[i]);
  +            }
  +            else
  +            {
  +                             break;
  +                     }
   
  -inline long
  -eTOeTransform(
  -                     const XSLTInputSource&                  inputSource,
  -             const XSLTInputSource&                  stylesheetSource,
  -             XSLTResultTarget&                               outputTarget,
  -                     StylesheetConstructionContext&  constructionContext,
  -                     StylesheetExecutionContext&             
executionContext,
  -                     XSLTProcessor&                                  
theProcessor)
  -{
  -     const clock_t startTime=clock();
  -
  -     theProcessor.process(
  -                             inputSource, 
  -                         stylesheetSource,
  -                             outputTarget,
  -                             constructionContext,
  -                             executionContext);
  +                     ++i;
  +        }
   
  -     const clock_t endTime=clock();
  +        if (i >= argc)
  +        {
  +            logger.error() << "Run file not specified" << endl;
  +                     usage();
  +                     exit(1);
  +        }
  +             else
  +             {
  +                     runFileName.assign(argv[i]);
  +             }
   
  -     return endTime - startTime;
  -}
   
  +             XalanFileUtility 
fileUtility(XalanMemMgrs::getDefaultXercesMemMgr());
   
  +             // setup testing parameters
  +        Parameters params(
  +                             runFileName,
  +                             testDirectory,
  +                             resultDirectory,
  +                             reportDirectory,
  +                             fileUtility,
  +                             logger);
   
  -void
  -setHelp(XalanFileUtility&    h)
  -{
  -     h.args.getHelpStream() << endl
  -              << "Perf dir [-out -sub -i -iter]"
  -              << endl
  -              << endl
  -              << "dir                (base directory for testcases)"
  -              << endl
  -              << "-out dir   (base directory for output)"
  -              << endl
  -              << "-sub dir (run files only from a specific directory)"
  -              << endl
  -              << "-i                (include all testcases)"
  -              << endl
  -              << "-iter n           (specifies number of iterations; must be 
> 0)"
  -              << endl;
  -}
  +             if (!params.initialized())
  +             {
  +                     exit(1);
  +             }
   
  -int
  -main(
  -                     int             argc,
  -                     char*   argv[])
  -{
  -#if !defined(NDEBUG) && defined(_MSC_VER)
  -     _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | 
_CRTDBG_LEAK_CHECK_DF);
  -     _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
  -     _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
  -#endif
  -    
  -     XERCES_CPP_NAMESPACE_QUALIFIER XMLPlatformUtils::Initialize();
  -
  -     MemoryManagerType & theManager = XalanMemMgrs::getDefaultXercesMemMgr();
  -
  -     const XalanDOMString    
processorType(XALAN_STATIC_UCODE_STRING("XalanC"), theManager);
  -     bool skip = true;               // Default will skip long tests
  -     bool setGold = false;
  -
  -     XalanFileUtility        h(theManager);
  -
  -     // Set the program help string,  then get the command line parameters.
  -     //
  -     setHelp(h);
  +             // create report file 
  +             XalanDOMString reportFile = params.getResultDirectory();
  +             reportFile += params.getResultFile();
  +             reportFile += params.getUniqId();
  +             reportFile += XalanDOMString(".xml");
   
  -     if (h.getParams(argc, argv, "PERF-RESULTS", setGold) == true)
  -     {
  +             XalanXMLFileReporter 
reporter(XalanMemMgrs::getDefaultXercesMemMgr(), reportFile);
   
  -             // Generate Unique Run id and processor info
  -             XalanDOMString  UniqRunid(theManager);
  -        h.generateUniqRunid(UniqRunid);
  -             const XalanDOMString    resultFilePrefix(XalanDOMString("cpp"));
  -             XalanDOMString  resultsFile = h.args.output;
  -             resultsFile += resultFilePrefix;
  -             resultsFile += UniqRunid;
  -             resultsFile += XalanFileUtility::s_xmlSuffix;
  +             reporter.logTestFileInit(params.getDescription());
   
  -             XalanXMLFileReporter    logFile(theManager, resultsFile);
  +             // run test harness
  +             typedef TestHarness<XalanCProcessor> XalanCTestHarness;
   
  -             logFile.logTestFileInit("Performance Testing - Reports 
performance times for single transform, and average for multiple transforms 
using compiled stylesheet");
  +             XalanCTestHarness testHarness;
   
  -             try
  -             {
  -                     // Call the static initializers... and define file 
suffixes
  -                     // Having xmlplatformutils in it's own class like this 
means that if there are
  -                     // exceptions then terminate() is sure to run because 
it will automatically get
  -                     // cleaned up when this instance goes out of scope.
  -                     bool foundDir = false;  // Flag indicates directory 
found. Used in conjunction with -sub cmd-line arg.
  -                     {
  -                             XSLTInit        theInit(theManager);  
  -             
  -                             typedef XalanFileUtility::FileNameVectorType    
        FileNameVectorType;
  +        testHarness.init(fileUtility, reporter, logger);
   
  -                             // Get the list of Directories that are below 
perf and iterate through them
  -                             FileNameVectorType dirs(theManager);
  -                             
  -                             h.getDirectoryNames(h.args.base, dirs);
  -
  -                             const long      iterCount = h.args.iters;
  -
  -                             for(FileNameVectorType::size_type       j = 0; 
j < dirs.size(); j++)
  -                             {
  -                                     // Run specific sub of files from given 
directory
  -                                     if (length(h.args.sub) > 0 && 
!equals(dirs[j], h.args.sub))
  -                                     {
  -                                             continue;
  -                                     }
  -
  -                                     // Check that output directory is there.
  -                                     XalanDOMString  theOutputDir = 
h.args.output;
  -                                     theOutputDir += dirs[j];
  -                                     h.checkAndCreateDir(theOutputDir);
  -
  -                                     XalanDOMString logEntry("Performance 
Directory: ");
  -                                     logEntry += dirs[j];
  -                                     logFile.logTestCaseInit(logEntry);
  -                                     
  -                                     // Indicate that directory was 
processed and get test files from the directory
  -                                     foundDir = true;
  -                                     FileNameVectorType files(theManager);
  -                                     h.getTestFileNames(h.args.base, 
dirs[j], false, files);
  -
  -                                     for(FileNameVectorType::size_type i = 
0; i < files.size(); i++)
  -                                     {
  -                                             // Define  variables used for 
timing and reporting ...
  -                                             clock_t startTime, endTime, 
accmTime, avgEtoe;
  -                                             double timeinMilliseconds, 
theAverage;
  -
  -                                             typedef 
XalanXMLFileReporter::Hashtable Hashtable;
  -
  -                                             Hashtable attrs(theManager);
  -                                     
  -                                             if (skip && 
checkForExclusion(files[i]))
  -                                             {
  -                                                     continue;
  -                                             }
  -
  -                                             XalanDOMString  theXSLFile= 
h.args.base;
  -                                             theXSLFile += dirs[j];
  -                                             theXSLFile += 
XalanFileUtility::s_pathSep;
  -                                             theXSLFile += files[i];
  -                                             XalanDOMString  
theXMLFile(theManager);
  -                                             
h.generateFileName(theXSLFile,"xml", theXMLFile);
  -
  -                                             XalanDOMString  theOutput = 
h.args.output;
  -                                             theOutput += dirs[j];
  -                                             theOutput += 
XalanFileUtility::s_pathSep;
  -                                             theOutput += files[i]; 
  -                                             XalanDOMString  theOutputFile;
  -                                             h.generateFileName(theOutput, 
"out", theOutputFile);
  -
  -
  -                                             
attrs.insert(Hashtable::value_type(XalanDOMString("href"), theXSLFile));
  -                                             // Create the necessary support 
objects to instantiate a processor.
  -
  -                                             XercesDOMSupport                
                csDOMSupport;
  -                                             XercesParserLiaison             
                csParserLiaison(theManager, csDOMSupport);
  -
  -                                             /*XalanSourceTreeDOMSupport     
        csDOMSupport;
  -                                             XalanSourceTreeParserLiaison    
csParserLiaison(csDOMSupport);
  -
  -                                             
csDOMSupport.setParserLiaison(&csParserLiaison);
  -                                             */
  -
  -                                             XSLTProcessorEnvSupportDefault  
csXSLTProcessorEnvSupport(theManager);
  -                                             XObjectFactoryDefault           
        csXObjectFactory;
  -                                             XPathFactoryDefault             
                csXPathFactory;
  -     
  -                                             // Create a processor and 
connect to ProcessorEnvSupport object
  -                                             XSLTEngineImpl  csProcessor(
  -                                                             theManager,
  -                                                             csParserLiaison,
  -                                                             
csXSLTProcessorEnvSupport,
  -                                                             csDOMSupport,
  -                                                             
csXObjectFactory,
  -                                                             csXPathFactory);
  -
  -                                             // Hook up the processor the 
the support object.
  -                                             
csXSLTProcessorEnvSupport.setProcessor(&csProcessor);
  -
  -                                             // Create separate factory 
support object, so the stylesheet's
  -                                             // factory-created XPath 
instance are independent from processor's.
  -                                             XPathFactoryDefault             
        ssXPathFactory;
  -
  -                                             // Create a stylesheet 
construction context, using the
  -                                             // stylesheet's factory support 
objects.
  -                                             
StylesheetConstructionContextDefault    csConstructionContext(
  -                                                                             
                                theManager,
  -                                                                             
                                csProcessor,
  -                                                                             
                                ssXPathFactory);
  -                                             cout << endl << files[i] << 
endl;
  -
  -                                             // Create a parsed stylesheet 
(StylesheetRoot) for the
  -                                             // specified input XSL. We 
don't have to delete it, since
  -                                             // it is owned by the 
StylesheetConstructionContextDefault
  -                                             // instance. Time it as well...
  -     
  -                                             startTime = clock();
  -                                             const StylesheetRoot* const 
glbStylesheetRoot = processStylesheet(
  -                                                                             
                                                theXSLFile,
  -                                                                             
                                                csProcessor,
  -                                                                             
                                                csConstructionContext);
  -                                             endTime = clock();
  -                                             assert(glbStylesheetRoot != 0);
  -
  -                                             // Calculate & report 
performance on stylesheet parse to console and log file.
  -                                             timeinMilliseconds = 
calculateElapsedTime(startTime, endTime);
  -                                             cout << "   XSL: " << 
timeinMilliseconds << " milliseconds, Parse" << endl;
  -                                             
logFile.addMetricToAttrs("parsexsl",timeinMilliseconds, attrs);                 
                        
  -
  -                                             
  -                                             // Parse the input XML and 
report how long it took...                             
  -                                             startTime = clock();
  -                                             XalanNode* const  glbSourceXML 
= parseSourceDocument(theXMLFile, 
  -                                                                             
                                                        csProcessor);
  -                                             endTime = clock();
  -                                             assert(glbSourceXML != 0);
  -
  -                                             // Calculate & report 
performance on source document parse to console and log file.
  -                                             timeinMilliseconds = 
calculateElapsedTime(startTime, endTime);
  -                                             cout << "   XML: " << 
timeinMilliseconds << " milliseconds, Parse" << endl;
  -                                             
logFile.addMetricToAttrs("parsexml",timeinMilliseconds, attrs);
  -
  -
  -
  -                                             // The execution context uses 
the same factory support objects as
  -                                             // the processor, since those 
objects have the same lifetime as
  -                                             // other objects created as a 
result of the execution.
  -
  -                                             XSLTResultTarget                
theResultTarget(theOutputFile);
  -                                             const XSLTInputSource   
xslInputSource(theXSLFile);
  -                                             const XSLTInputSource   
xmlInputSource(theXMLFile);
  -
  -                                             
StylesheetExecutionContextDefault       psExecutionContext(
  -                                                                             
        theManager,
  -                                                                             
        csProcessor,
  -                                                                             
        csXSLTProcessorEnvSupport,
  -                                                                             
        csDOMSupport,
  -                                                                             
        csXObjectFactory);
  -
  -                                             // Perform a single transform 
using parsed stylesheet and unparsed xml source, report results...
  -                                             
csProcessor.setStylesheetRoot(glbStylesheetRoot);
  -                                             //const XSLTInputSource 
csSourceDocument(glbSourceXML);
  -
  -                                             startTime = clock();
  -                                             
csProcessor.process(xmlInputSource, 
  -                                                                     
theResultTarget, 
  -                                                                     
psExecutionContext);
  -                                             endTime = clock();
  -
  -                                             psExecutionContext.reset();     
// Reset the execution context...
  -                                             timeinMilliseconds = 
calculateElapsedTime(startTime, endTime);
  -
  -                                             // Output single transform time 
to console and result log
  -                                             cout << endl << "   One: " << 
timeinMilliseconds << " w/Parsed XSL" << endl;
  -                                             
logFile.addMetricToAttrs("single",timeinMilliseconds, attrs);
  -
  -
  -                                             // Do a total end to end 
transform with no pre parsing of either xsl or xml files.
  -                                             const etoetran = 
eTOeTransform(xmlInputSource, 
  -                                                                             
                        xslInputSource,
  -                                                                             
                        theResultTarget,
  -                                                                             
                        csConstructionContext,
  -                                                                             
                        psExecutionContext,
  -                                                                             
                        csProcessor);
  -     
  -                                             // Output single etoe transform 
time to console and result log
  -                                             cout << "   One: " << etoetran 
<< " eToe" << endl;
  -                                             
logFile.addMetricToAttrs("etoe", etoetran, attrs);
  -
  -
  -                                             // Perform multiple transforms 
and calculate the average time ..
  -                                             // These are done 3 different 
ways.
  -                                             // FIRST: Parsed XSL Stylesheet 
and Parsed XML Source.
  -
  -                                             accmTime = 0;
  -                                             for(int j = 0; j < iterCount; 
++j)
  -                                             {       
  -                                                     accmTime += 
transformWParsedSource(glbSourceXML,
  -                                                                             
                                 csProcessor,
  -                                                                             
                                 glbStylesheetRoot,
  -                                                                             
                                 theResultTarget,
  -                                                                             
                                 psExecutionContext);
  -                                                     
psExecutionContext.reset();                                                     
  -                                             }
  -                                             csParserLiaison.reset();
  -                                             theAverage = 
calculateAvgTime(accmTime, iterCount); 
  -
  -                                             // Output average transform 
time to console and result log
  -                                             cout << endl  << "   Avg: " << 
theAverage << " for " << iterCount << " iter's w/Parsed files" << endl;
  -                                             
logFile.addMetricToAttrs("avgparsedxml",theAverage, attrs);
  -
  -                                             // SECOND: Parsed Stylesheet 
and UnParsed XML Source.
  -                                             // This is currently how the 
XalanJ 2.0 is performing transforms,
  -                                             // i.e. with the unparsed XML 
Source.
  -                                             
  -                                             accmTime = 0;
  -                                             for(int k = 0; k < iterCount; 
++k)
  -                                             {
  -                                                     accmTime += 
transformWUnparsedSource(theXMLFile,
  -                                                                             
                                 csProcessor,
  -                                                                             
                                 glbStylesheetRoot,
  -                                                                             
                                 theResultTarget,
  -                                                                             
                                 psExecutionContext);
  -                                                     
psExecutionContext.reset();             // Resets the execution context
  -                                                     
csParserLiaison.reset();                // This deletes the document
  -                                             }
  +             testHarness.executeTestCases(params.getTestCases());
   
  -                                             theAverage = 
calculateAvgTime(accmTime, iterCount);
  -                                             cout << "   Avg: " << 
theAverage << " for " << iterCount << " iter's w/UnParsed XML" << endl;
  +             reporter.logTestFileClose("","");
   
  -                                             
logFile.addMetricToAttrs("avgunparsedxml",theAverage, attrs);
  +             reporter.close();
   
  -                                             // THIRD: Neither Stylesheet 
nor XML Source are parsed.
  -                                             // Perform multiple etoe 
transforms and calculate the average ...
  +             // generate reports
  +             generateReports(params, reportFile, logger);
                
  -                                             avgEtoe = 0;
  -                                             for(int jj = 0; jj < iterCount; 
++jj)
  -                                             {       
  -                                             avgEtoe += 
eTOeTransform(xmlInputSource, 
  -                                                                             
                        xslInputSource,
  -                                                                             
                        theResultTarget,
  -                                                                             
                        csConstructionContext,
  -                                                                             
                        psExecutionContext,
  -                                                                             
                        csProcessor);
  -                                             psExecutionContext.reset();     
  -                                             csParserLiaison.reset();        
                                        
  -                                             }
  -
  -                                             theAverage = 
calculateAvgTime(avgEtoe,iterCount);
  -
  -                                             // Output average transform 
time to console and result log
  -                                             cout << "   Avg: " << 
theAverage << " for " << iterCount << " iter's of eToe" << endl;
  -                                             
logFile.addMetricToAttrs("avgetoe",theAverage, attrs);
  -                                             logFile.logElementWAttrs(10, 
"perf", attrs, "xxx");
  -                                     }
  -     
  -                                     logEntry = "Performance Directory: ";
  -                                     logEntry += dirs[j];
  -                                     logFile.logTestCaseClose(logEntry, 
XalanDOMString("Done"));
  -                             }
  -
  -                     }
  -
  -                     // Check to see if -sub cmd-line directory was 
processed correctly.
  -                     if (!foundDir)
  -                     {       
  -                             cout << "Specified test directory: \"" << 
c_str(TranscodeToLocalCodePage(h.args.sub)) << "\" not found" << endl;
  -                     }
  -
  -                     h.reportPassFail(logFile, UniqRunid);
  -                     logFile.logTestFileClose("Performance", "Done");
  -                     logFile.close();
  -             }
  -             catch(const 
XalanFileOutputStream::XalanFileOutputStreamOpenException& ex)
  -             {
  -                     cerr << ex.getMessage() << endl << endl;
  -             }
  -             catch(...)
  -             {
  -                     cerr << "Exception caught!!!" << endl  << endl;
  -             }
  +             // create latest copy for baseline testing
  +             XalanDOMString latestReportFile = params.getResultDirectory();
  +             latestReportFile += params.getResultFile();
  +             latestReportFile += XalanDOMString("_latest.xml");
  +             copyFile(latestReportFile, reportFile);
        }
   
  -     XERCES_CPP_NAMESPACE_QUALIFIER XMLPlatformUtils::Terminate();
  +     XalanTransformer::terminate();
  +    XMLPlatformUtils::Terminate();
   
        return 0;
   }
  
  
  
  1.1                  xml-xalan/c/Tests/Performance/Logger.cpp
  
  Index: Logger.cpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  
  
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <ctime>
  #include <iomanip>
  
  
  
  #include "Logger.hpp"
  
  
  
  using namespace std;
  
  
  
  Logger::Logger(ostream & stream) :
                m_stream(stream)
  {     
        logText[eMessage] = "Message";
        logText[eWarning] = "Warning";
        logText[eError] = "Error";
  }
  
  
  
  ostream& 
  Logger::message()
  {
        return log(eMessage);
  }
  
  
  
  ostream& 
  Logger::warning()
  {
        return log(eWarning);
  }
  
  
  
  ostream& 
  Logger::error()
  {
        return log(eError);
  }
  
  
  ostream& 
  Logger::log(eLogType logType)
  {
        time_t theTime;
        time(&theTime);
  
        // Not thread safe
        char * timeStr = ctime(&theTime);
        timeStr[24] = '\0';
  
        m_stream << timeStr << setw(10) << logText[logType] << ": ";
        return m_stream;
  }
  
  
  1.1                  xml-xalan/c/Tests/Performance/Logger.hpp
  
  Index: Logger.hpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #if !defined(LOGGER_HEADER_GUARD_1357924680)
  #define LOGGER_HEADER_GUARD_1357924680
  
  
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <iostream>
  
  
  
  #include <xalanc/XalanDOM/XalanDOMString.hpp>
  
  
  
  XALAN_USING_STD(ostream)
  XALAN_USING_XALAN(XalanDOMString)
  
  
  
  class Logger
  {
  public:
  
        Logger(ostream & stream);
  
        typedef enum { eMessage = 0, eWarning = 1, eError = 2} eLogType;
  
        ostream& message();
        ostream& warning();
        ostream& error();
        
        ostream& log(eLogType logType);
  
  protected:
  
        char * logText[3];
  
        ostream& m_stream;
  };
  
  
  
  #endif LOGGER_HEADER_GUARD_1357924680
  
  
  1.1                  xml-xalan/c/Tests/Performance/Parameters.cpp
  
  Index: Parameters.cpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #include <iostream>
  
  
  
  #include <xalanc/Include/XalanMemoryManagement.hpp>
  
  
  
  #include <xalanc/XalanTransformer/XalanParsedSource.hpp>
  
  
  
  #include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  
  
  
  #include <xalanc/XalanDOM/XalanDocument.hpp>
  #include <xalanc/XalanDOM/XalanNode.hpp>
  #include <xalanc/XalanDOM/XalanNamedNodeMap.hpp>
  #include <xalanc/XalanDOM/XalanDOMString.hpp>
  
  
  
  #include <xalanc/Harness/XalanFileUtility.hpp>
  
  
  
  #include "Parameters.hpp"
  #include "Utils.hpp"
  
  
  
  XALAN_USING_XALAN(XalanTransformer)
  XALAN_USING_XALAN(XalanParsedSource)
  XALAN_USING_XALAN(XalanDocument)
  XALAN_USING_XALAN(XalanNode)
  XALAN_USING_XALAN(XalanNamedNodeMap)
  XALAN_USING_XALAN(XalanDOMString)
  XALAN_USING_XALAN(WideStringToLong)
  XALAN_USING_XALAN(compareIgnoreCaseASCII)
  XALAN_USING_XALAN(XalanMemMgrs)
  XALAN_USING_XALAN(MemoryManagerType)
  XALAN_USING_XALAN(XalanFileUtility)
  
  XALAN_USING_STD(endl);
  
  
  
  /**
   * Processes parameters for the test harness
   */
  Parameters::Parameters(
          const XalanDOMString& runFileName,
          const XalanDOMString& testDirectory,
          const XalanDOMString& resultDirectory,
                const XalanDOMString& reportDirectory,
                XalanFileUtility&               fileUtility,
                Logger & logger) :
        m_name(),
        m_description(),
        m_resultDirectory(resultDirectory),
        m_resultFile("results"),
        m_threshold("5"),
        m_baselineDirectory(),
        m_baselineFile(),
        m_defaultTestCase(),
        m_testDirectory(testDirectory),
        m_goldDirectory(),
        m_reportDirectory(reportDirectory),
        m_transformer(),
        m_initialized(false),
        m_uniqId()
  {
        fileUtility.generateUniqRunid(m_uniqId);
  
        if (parseConfigurationFile(runFileName, logger))
        {
                if (m_testDirectory.empty())
                {
                        logger.error() << "No test directory specified on 
command line or in configuration file" << endl;
                }
                else
                {
                        // configure directories
                        // result directory
                        if (m_resultDirectory.empty())
                        {
                                m_resultDirectory = getWorkingDirectory();
                        }
                        m_resultDirectory += getPathSep();
  
                        // gold directory
                        if (m_goldDirectory.empty())
                        {
                                m_goldDirectory = m_testDirectory;
                                m_goldDirectory += XalanDOMString("-gold");
                        }
                        
                        // test directory
                        m_testDirectory += getPathSep();
  
                        if (readTestCases(fileUtility, logger))
                        {
                                m_initialized = true;
                        }
  
                        // baseline directory
                        if (m_baselineDirectory.empty())
                        {
                                m_baselineDirectory = m_resultDirectory;
                        }
                        else
                        {
                                m_baselineDirectory += getPathSep();
                        }
  
                        if (m_baselineFile.empty())
                        {
                                m_baselineFile = m_resultFile;
                                m_baselineFile += XalanDOMString("_latest.xml");
                        }
  
                        // report directory
                        if (m_reportDirectory.empty())
                        {
                                m_reportDirectory = getWorkingDirectory();
                        }
                        m_reportDirectory += getPathSep();
                }
        }
  }
  
  
  
  const TestCasesType& 
  Parameters::getTestCases()
  {
        return m_testCases;
  }
  
  
  
  bool
  Parameters::parseConfigurationFile(
          const XalanDOMString& runFileName,
                Logger& logger)
  {
        // parse the configuration file and get default settings
  
      XalanParsedSource* theParsedSource;
  
      if (m_transformer.parseSource(runFileName, theParsedSource) < 0)
        {
                logger.error() << "Failed to parse: " 
                                << runFileName.c_str() 
                                << ", error: " 
                                << m_transformer.getLastError() 
                                << endl;
                return false;
        }
  
      XalanDocument* document = theParsedSource->getDocument();
  
      XalanNode* runNode = document->getFirstChild();
  
        while (runNode->getNodeType() != XalanNode::ELEMENT_NODE)
        {
                runNode = runNode->getNextSibling();
                if (0 == runNode)
                {
                        logger.error() << "Failed to parse: " 
                                << runFileName.c_str() 
                                << ", error: no <testconfig> found"
                                << endl;
                        return false;
                }
        }
  
      if(!(runNode->getNodeName() == XalanDOMString("testconfig")))
      {
                logger.error() << "Invalid configuration file: "
                                << runFileName.c_str()
                                << ", error: Missing <testconfig> tag" 
                                << endl;
          return false;
      }
  
      const XalanNamedNodeMap* attributes = runNode->getAttributes();
  
      if (attributes != 0)
      {
          XalanNode* nameAttribute = 
attributes->getNamedItem(XalanDOMString("name"));
  
          if (nameAttribute != 0 &&
                        !nameAttribute->getNodeValue().empty())
          {
              m_name = nameAttribute->getNodeValue();
          }
                else
                {
                        logger.error() << "Invalid configuration file: "
                                << runFileName.c_str()
                                << ", error: Missing name attribute" 
                                << endl;
                        return false;
                }
      }
  
      XalanNode* currentNode = runNode->getFirstChild();
  
      while(currentNode != 0)
      {
          if (currentNode->getNodeType() != XalanNode::ELEMENT_NODE)
          {
              currentNode = currentNode->getNextSibling();
              continue;
          }
  
                // description element 
          if (currentNode->getNodeName() == XalanDOMString("description") &&
              currentNode->getFirstChild() != 0 &&
              currentNode->getFirstChild()->getNodeType() == 
XalanNode::TEXT_NODE)
          {
              m_description = currentNode->getFirstChild()->getNodeValue();
          }
                // results element
          else if (currentNode->getNodeName() == XalanDOMString("results"))
          {
                        // file-path
              const XalanNamedNodeMap* resultAttributes = 
currentNode->getAttributes();
              XalanNode * attributeNode = 
resultAttributes->getNamedItem(XalanDOMString("file-path"));
              if (attributeNode != 0 &&
                  attributeNode->getNodeType() == XalanNode::ATTRIBUTE_NODE)
              {
                                if (!m_resultDirectory.empty())
                                {
                                        m_resultDirectory += getPathSep();
                                }
                  m_resultDirectory += attributeNode->getNodeValue();
              }
  
                        // result report file name
              XalanNode * resultsNode = currentNode->getFirstChild();
              if (resultsNode != 0 
                  && resultsNode->getNodeType() == XalanNode::TEXT_NODE
                  && !resultsNode->getNodeValue().empty())
              {
                  m_resultFile = resultsNode->getNodeValue();
              }
          }
                // baseline element
                else if (currentNode->getNodeName() == 
XalanDOMString("baseline"))
                {
                        const XalanNamedNodeMap* attributeParams = 
currentNode->getAttributes();
              XalanNode* attributeNode;
                        // threshold
              attributeNode = 
attributeParams->getNamedItem(XalanDOMString("threshold"));
                        if (attributeNode != 0
                                && !attributeNode->getNodeValue().empty())
                        {
                                m_threshold = 
attributeNode->getNodeValue().c_str();
                        }
                        // file-path
                        attributeNode = 
attributeParams->getNamedItem(XalanDOMString("file-path"));
                        if (attributeNode != 0)
                        {
                                m_baselineDirectory = 
attributeNode->getNodeValue();
                        }
                        // baseline file
                        XalanNode * baselineNode = currentNode->getFirstChild();
                        if (baselineNode != 0
                                && baselineNode->getNodeType() == 
XalanNode::TEXT_NODE
                                && !baselineNode->getNodeValue().empty())
                        {
                                m_baselineFile += baselineNode->getNodeValue();
                        }
                }
                // default parameters
          else if (currentNode->getNodeName() == 
XalanDOMString("default-parameter-set"))
          {
              const XalanNamedNodeMap* attributeParams = 
currentNode->getAttributes();
              XalanNode* attributeNode;
              attributeNode = 
attributeParams->getNamedItem(XalanDOMString("input-mode"));
              if (attributeNode != 0 &&
                  attributeNode->getNodeType() == XalanNode::ATTRIBUTE_NODE &&
                  !attributeNode->getNodeValue().empty())
              {
                  m_defaultTestCase.inputMode = attributeNode->getNodeValue(); 
              }
                        // number of iterations
              attributeNode = 
attributeParams->getNamedItem(XalanDOMString("num-iterations"));
              if (attributeNode != 0 &&
                  attributeNode->getNodeType() == XalanNode::ATTRIBUTE_NODE &&
                  WideStringToLong(attributeNode->getNodeValue().c_str()) > 0)
              {
                  m_defaultTestCase.numIterations = 
WideStringToLong(attributeNode->getNodeValue().c_str()); 
              }
                        // minimum time to execute
              attributeNode = 
attributeParams->getNamedItem(XalanDOMString("min-time-to-execute"));
              if (attributeNode != 0 &&
                  attributeNode->getNodeType() == XalanNode::ATTRIBUTE_NODE &&
                  WideStringToLong(attributeNode->getNodeValue().c_str()) > 0)
              {
                  m_defaultTestCase.minTimeToExecute = 
WideStringToLong(attributeNode->getNodeValue().c_str());
              }
                        // verify the result
              attributeNode = 
attributeParams->getNamedItem(XalanDOMString("verify-result"));
              if (attributeNode != 0 &&
                  attributeNode->getNodeType() == XalanNode::ATTRIBUTE_NODE &&
                  
compareIgnoreCaseASCII(attributeNode->getNodeValue().c_str(),XalanDOMString("yes").c_str())
 == 0)
              {
                  m_defaultTestCase.verifyResult = true;
              }
              // get processor specific parameters
              XalanNode * options = currentNode->getFirstChild();
              while (options != 0)
              {
                  if (options->getNodeType() != XalanNode::ELEMENT_NODE)
                  {
                      options = options->getNextSibling();
                      continue;
                  }
  
                  const XalanDOMString* processorName = 0;
  
                  const XalanNamedNodeMap* optionAttributes = 
options->getAttributes();
                  XalanNode* processorOption = 
optionAttributes->getNamedItem(XalanDOMString("processor"));
                  if (processorOption != 0 &&
                      processorOption->getNodeType() == 
XalanNode::ATTRIBUTE_NODE)
                  {
                      processorName = &(processorOption->getNodeValue());
                  }
  
                  if (processorName != 0 && processorName->empty() == true)
                  {
                      options = options->getNextSibling();
                      continue;
                  }
  
                  if (options->getNodeName() == XalanDOMString("init-options"))
                  {
                      
m_defaultTestCase.processorOptions[*processorName].initOptions = 
options->getFirstChild();
                  }
                  else if (options->getNodeName() == 
XalanDOMString("compile-options"))
                  {
                      
m_defaultTestCase.processorOptions[*processorName].compileOptions = 
options->getFirstChild();
                  }
                  else if (options->getNodeName() == 
XalanDOMString("parse-options"))
                  {
                      
m_defaultTestCase.processorOptions[*processorName].parseOptions = 
options->getFirstChild();
                  }
                  else if (options->getNodeName() == 
XalanDOMString("result-options"))
                  {
                      
m_defaultTestCase.processorOptions[*processorName].resultOptions = 
options->getFirstChild();
                  }
                  else if (options->getNodeName() == 
XalanDOMString("transform-options"))
                  {
                      
m_defaultTestCase.processorOptions[*processorName].transformOptions = 
options->getFirstChild();
                  }
  
                  options = options->getNextSibling();
              }
          }
                else if (currentNode->getNodeName() == 
XalanDOMString("testcases"))
                {
                        // file-path
              const XalanNamedNodeMap* testCasesAttributes = 
currentNode->getAttributes();
              XalanNode * attributeNode = 
testCasesAttributes->getNamedItem(XalanDOMString("file-path"));
              if (attributeNode != 0 &&
                  attributeNode->getNodeType() == XalanNode::ATTRIBUTE_NODE)
              {
                                if (!m_testDirectory.empty())
                                {
                                        m_testDirectory += getPathSep();
                                }
                  m_testDirectory += attributeNode->getNodeValue();
              }
                        // gold file-path
              attributeNode = 
testCasesAttributes->getNamedItem(XalanDOMString("gold-file-path"));
              if (attributeNode != 0 &&
                  attributeNode->getNodeType() == XalanNode::ATTRIBUTE_NODE)
              {
                  m_goldDirectory = attributeNode->getNodeValue();
              }
                }
          currentNode = currentNode->getNextSibling();
      }
  
        return true;
  }
  
  
  
  bool
  Parameters::readTestCases(
        XalanFileUtility&       fileUtility,
        Logger&                         logger)
  {
      if (!fileUtility.checkDir(m_testDirectory))
      {
                logger.error() << "Invalid test directory: " << 
m_testDirectory.c_str() << endl;
                return false;
      }
  
        if (!fileUtility.checkDir(m_goldDirectory))
        {
                logger.error() << "Invalid gold directory: " << 
m_goldDirectory.c_str() << endl;
                return false;
        }
  
      fileUtility.checkAndCreateDir(m_resultDirectory);
  
      typedef XalanFileUtility::FileNameVectorType FileNamesType;
      FileNamesType dirNames;
  
      fileUtility.getDirectoryNames(m_testDirectory, dirNames);
  
      FileNamesType::iterator dirIter = dirNames.begin();
  
        // for each test directory
      while (dirIter != dirNames.end())
      {
         
          FileNamesType xslTestFiles;
          fileUtility.getTestFileNames(m_testDirectory, *dirIter, true, 
xslTestFiles);
  
          FileNamesType::const_iterator xslIter = xslTestFiles.begin();
  
                // for each stylesheet
          while (xslIter != xslTestFiles.end())
          {
                        // configure the stylesheet
              TestCase testCase = m_defaultTestCase;
              testCase.stylesheet = m_testDirectory;
              testCase.stylesheet += *dirIter;
                        testCase.stylesheet += getPathSep();
                        testCase.stylesheet += *xslIter;
  
              
              bool status = true;
  
                        // configure the input document
              fileUtility.generateFileName(testCase.stylesheet, "xml", 
testCase.inputDocument, &status);
              if (status != true)
              {
                                logger.warning() << "No matching input file 
for" << testCase.stylesheet.c_str() << endl;
                  ++xslIter;
                  continue;
                        }
  
                        // configure result directory
              testCase.resultDirectory = m_resultDirectory;
                        testCase.resultDirectory += *dirIter;
   
              // configure result document        
              XalanDOMString outFile = testCase.resultDirectory;
                        outFile += getPathSep();
                        outFile += *xslIter;
  
              fileUtility.generateFileName(outFile, "out", 
testCase.resultDocument);
  
                        // configure gold result
                        outFile = m_goldDirectory;
                        outFile += getPathSep();
                        outFile += *dirIter;
                        outFile += getPathSep();
                        outFile += *xslIter;
  
                        status = true;
                        fileUtility.generateFileName(outFile, "out", 
testCase.goldResult, &status);
                        if (true == testCase.verifyResult && !status)
                        {
                                logger.warning() << "Verification on, but no 
matching gold file: " << testCase.goldResult.c_str() << endl;
                        }
  
              m_testCases.push_back(testCase);
              
              ++xslIter;
          }
  
          ++dirIter;
      }
  
        return true;
  }
  
  
  1.1                  xml-xalan/c/Tests/Performance/Parameters.hpp
  
  Index: Parameters.hpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #if !defined(XALANCPARAMETERS_HEADER_GUARD_1357924680)
  #define XALANCPARAMETERS_HEADER_GUARD_1357924680
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <xalanc/XalanDOM/XalanDOMString.hpp>
  
  
  
  
  #include <xalanc/XalanTransformer/XalanTransformer.hpp>
  
  
  
  #include <xalanc/Harness/XalanFileUtility.hpp>
  
  
  
  #include "TestHarness.hpp"
  #include "Logger.hpp"
  
  
  
  XALAN_USING_XALAN(XalanDOMChar)
  XALAN_USING_XALAN(XalanDOMString)
  XALAN_USING_XALAN(XalanTransformer)
  XALAN_USING_XALAN(XalanFileUtility)
  
  
  
  class Parameters
  {
  public:
      Parameters(
            const XalanDOMString&       runFileName,
          const XalanDOMString& testDirectory,
          const XalanDOMString& resultDirectory,
                const XalanDOMString&   reportDirectory,
                XalanFileUtility&               fileUtility,
                Logger& log);
  /*
      const XalanDOMString& 
      getRunName() { return m_name;}
  */
        bool
        initialized() {return m_initialized;}
  
        XalanDOMString&
        getName() {return m_name;}
  
        XalanDOMString&
        getUniqId() {return m_uniqId;}
  
        XalanDOMString&
        getDescription() {return m_description;}
  
        XalanDOMString&
        getResultDirectory() {return m_resultDirectory;}
  
        XalanDOMString&
        getResultFile() {return m_resultFile;}
  
        XalanDOMString&
        getThreshold() { return m_threshold;}
  
        XalanDOMString&
        getBaselineDirectory() {return m_baselineDirectory;}
  
        XalanDOMString&
        getBaselineFile() {return m_baselineFile;}
  
        XalanDOMString&
        getReportDirectory() {return m_reportDirectory;}
        
        const TestCasesType& 
      getTestCases();
  
  protected:
  
      bool parseConfigurationFile(
                        const XalanDOMString& runFileName, 
                        Logger& logger);
  
      bool readTestCases(
                        XalanFileUtility&       fileUtility,
                        Logger &                        logger);
  
        XalanDOMString  m_name;
        XalanDOMString  m_description;
  
      XalanDOMString    m_resultDirectory;
      XalanDOMString    m_resultFile;
  
        XalanDOMString  m_threshold;
        XalanDOMString  m_baselineDirectory;
        XalanDOMString  m_baselineFile;
        
      TestCase          m_defaultTestCase;
  
        XalanDOMString  m_testDirectory;
        XalanDOMString  m_goldDirectory;
        XalanDOMString  m_reportDirectory;
  
      TestCasesType   m_testCases;
  
        XalanTransformer m_transformer;
  
        XalanDOMString  m_uniqId;
  
        bool m_initialized;
  };
  
  
  
  #endif // XALANCPARAMETERS_HEADER_GUARD_1357924680
  
  
  1.1                  xml-xalan/c/Tests/Performance/TestHarness.cpp
  
  Index: TestHarness.cpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #include "TestHarness.hpp"
  
  
  #include <xalanc/Include/XalanMemoryManagement.hpp>
  
  
  #include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  
  
  
  XALAN_USING_XALAN(XalanMemMgrs)
  XALAN_USING_XALAN(CharVectorType)
  XALAN_USING_XALAN(c_str)
  
  
  XALAN_USING_STD(ostringstream)
  
  
  
  TestCase::TestCase() :
          stylesheet(""),
          inputDocument(""),
          resultDocument(""),
          resultDirectory(""),
          goldResult(""),
          numIterations(1),
          minTimeToExecute(0),
          verifyResult(false),
          inputMode("file"),
          processorOptions(XalanMemMgrs::getDefaultXercesMemMgr())
  {
  }
  
  TestCase::TestCase(const TestCase& theRhs) :
          stylesheet(theRhs.stylesheet),             
          inputDocument(theRhs.inputDocument),
          resultDocument(theRhs.resultDocument),
          resultDirectory(theRhs.resultDirectory),
          goldResult(theRhs.goldResult),
          numIterations(theRhs.numIterations),
          minTimeToExecute(theRhs.minTimeToExecute),
          verifyResult(theRhs.verifyResult),
          inputMode(theRhs.inputMode),
          processorOptions(theRhs.processorOptions, 
XalanMemMgrs::getDefaultXercesMemMgr())
  {
  }
  
  
  1.1                  xml-xalan/c/Tests/Performance/TestHarness.hpp
  
  Index: TestHarness.hpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #if !defined(TESTHARNESS_HEADER_GUARD_1357924680)
  #define TESTHARNESS_HEADER_GUARD_1357924680
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <fstream>
  
  
  
  #include <xalanc/Include/XalanMemoryManagement.hpp>
  #include <xalanc/Include/XalanVector.hpp>
  #include <xalanc/Include/XalanMap.hpp>
  
  
  
  #include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  
  
  
  #include <xalanc/XalanDOM/XalanNode.hpp>
  #include <xalanc/XalanDOM/XalanDOMString.hpp>
  
  
  
  #include <xalanc/Harness/XalanFileUtility.hpp>
  #include <xalanc/Harness/XalanXMLFileReporter.hpp>
  
  
  
  #include "Utils.hpp"
  #include "Logger.hpp"
  #include "Timer.hpp"
  
  
  
  XALAN_USING_XALAN(XalanMemMgrs)
  XALAN_USING_XALAN(XalanVector)
  XALAN_USING_XALAN(XalanMap)
  XALAN_USING_XALAN(XalanNode)
  XALAN_USING_XALAN(XalanDOMString)
  XALAN_USING_XALAN(XalanFileUtility)
  XALAN_USING_XALAN(XalanXMLFileReporter)
  
  
  
  XALAN_USING_STD(istringstream)
  
  
  
  /**
   * Processor interface options
   */
  struct ProcessorOptions
  {
      XalanNode*  initOptions;
      XalanNode*  compileOptions;
      XalanNode*  parseOptions;
      XalanNode*  resultOptions;
      XalanNode*  transformOptions;
  
      ProcessorOptions() :
              initOptions(0),
              compileOptions(0),
              parseOptions(0),
              resultOptions(0),
              transformOptions(0)
      {
      }
  };
  
  
  
  /**
   * Test case
   */
  class TestCase
  {
  public:
      
      TestCase();
  
      TestCase(const TestCase& theRhs);
  
      XalanDOMString  stylesheet;
      XalanDOMString  inputDocument;
      XalanDOMString  resultDocument;
      XalanDOMString  resultDirectory;
      XalanDOMString  goldResult;
      long            numIterations;
      long            minTimeToExecute;
      bool            verifyResult;
      XalanDOMString  inputMode;
  
      typedef XalanMap<XalanDOMString, ProcessorOptions>  ProcessorOptionsMap;
  
      ProcessorOptionsMap processorOptions;
  };
  
  
  
  typedef TestCase                                      TestCaseType;
  typedef XalanVector<TestCaseType>     TestCasesType;
  
  
  
  /**
   *  Test harness
   */
  template <class Processor>
  class TestHarness
  {
  public:
  
      typedef typename Processor::CompiledStylesheetType  
CompiledStylesheetType;
        typedef typename Processor::ParsedInputSourceType   
ParsedInputSourceType;
      typedef typename Processor::ResultTargetType        ResultTargetType;
  
        typedef typename XalanXMLFileReporter::Hashtable        
TestAttributesType;
  
      TestHarness();
  
      void init(
                        XalanFileUtility&               fileUtility,
                        XalanXMLFileReporter&   reporter,
                        Logger&                                 logger);
  
      void terminate();
  
        void executeTestCase(const TestCaseType& testCase);
        
  
        void executeTestCases(const TestCasesType& testCases);
  
  
  protected:
  
        Processor m_processor;
  
        XalanFileUtility*               m_fileUtility;
  
        XalanXMLFileReporter*   m_reporter;
  
        Logger*                                 m_logger;
  };
  
  
  
  template <class Processor>
  void
  TestHarness<Processor>::executeTestCases(const TestCasesType& testCases)
  {
      TestCasesType::const_iterator testCaseIter = testCases.begin();
        while (testCaseIter != testCases.end())
        {
                executeTestCase(*testCaseIter);
                ++testCaseIter;
        }
  }
  
  
  
  template <class Processor>
  void
  TestHarness<Processor>::executeTestCase(const TestCaseType& testCase)
  {
        TestAttributesType 
testAttributes(XalanMemMgrs::getDefaultXercesMemMgr());
        
        
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("stylesheet"),
 testCase.stylesheet));
        
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("input-document"),
 testCase.inputDocument));
  
        try {
  
                CompiledStylesheetType  compiledStylesheet;
                ParsedInputSourceType   parsedInputSource;
                ResultTargetType        resultTarget;
  
                static const ProcessorOptions defaultProcessor;
                
                TestCase::ProcessorOptionsMap::const_iterator iter = 
testCase.processorOptions.find(m_processor.getName());
  
                const ProcessorOptions&  processor = iter != 
testCase.processorOptions.end() ? iter->second : defaultProcessor;
                
          m_fileUtility->checkAndCreateDir(testCase.resultDirectory);
  
            Timer timeCompile;
                
                if (testCase.inputMode == XalanDOMString("stream"))
                {
              istringstream compilerStream; 
              fileToStream(testCase.stylesheet, compilerStream);
  
                        timeCompile.start();
                        compiledStylesheet = m_processor.compileStylesheet(
                                        compilerStream,
                                        processor.compileOptions);
                        timeCompile.stop();
                }
          else if (testCase.inputMode == XalanDOMString("file"))
                {
              timeCompile.start();
              compiledStylesheet = m_processor.compileStylesheet(
                      testCase.stylesheet,
                      processor.compileOptions);
              timeCompile.stop();
          }
                else 
                {
                        m_logger->error() 
                                        << "Mode: " 
                                        << testCase.inputMode.c_str()
                                        << " is inavlid for stylesheet: "
                                        << testCase.stylesheet
                                        << endl;
                }
  
                m_reporter->addMetricToAttrs("compile-xsl", 
timeCompile.getElapsedTime(), testAttributes);
  
          long numIterations = 0;
  
                long totalParseInputTime = 0;
                long minParseInputTime = LONG_MAX;
                long maxParseInputTime = 0 ;
  
                long totalTransformTime = 0;
                long minTransformTime = LONG_MAX;
                long maxTransformTime = 0;
  
                
          Timer timeTotalRun;
          timeTotalRun.start();
  
          while (numIterations < testCase.numIterations 
              && timeTotalRun.getElapsedTime() < testCase.minTimeToExecute)
          {       
                        Timer timeInput;
              if (testCase.inputMode == XalanDOMString("stream"))
              {
                  istringstream inputStream;
                  fileToStream(testCase.inputDocument, inputStream);
                
                            timeInput.start();
                  parsedInputSource = m_processor.parseInputSource(
                          inputStream, 
                          processor.parseOptions);
                            timeInput.stop();
                    }
                    else if (testCase.inputMode == XalanDOMString("file"))
                    {
                  timeInput.start();
                  parsedInputSource = m_processor.parseInputSource(
                          testCase.inputDocument, 
                          processor.parseOptions);
                    timeInput.stop();
                    }
                    else 
                    {
                                m_logger->error() 
                                        << "Mode: " 
                                        << testCase.inputMode.c_str()
                                        << " is inavlid for input document: "
                                        << testCase.inputDocument
                                        << endl;
                    }
                        
                        totalParseInputTime += timeInput.getElapsedTime();
                        minParseInputTime = timeInput.getElapsedTime() < 
minParseInputTime ? timeInput.getElapsedTime() : minParseInputTime;
                        maxParseInputTime = timeInput.getElapsedTime() > 
maxParseInputTime ? timeInput.getElapsedTime() : maxParseInputTime;
  
  
              resultTarget = m_processor.createResultTarget(
                      testCase.resultDocument, 
                      processor.resultOptions);
    
              Timer timeTransform;
              timeTransform.start();
              m_processor.transform(
                      compiledStylesheet,
                      parsedInputSource,
                      resultTarget);
              timeTransform.stop();
  
                        totalTransformTime += timeTransform.getElapsedTime();
                        minTransformTime = timeTransform.getElapsedTime() < 
minTransformTime ? timeTransform.getElapsedTime() : minTransformTime;
                        maxTransformTime = timeTransform.getElapsedTime() > 
maxTransformTime ? timeTransform.getElapsedTime() : maxTransformTime;
  
                        ++numIterations;
          }
  
                timeTotalRun.stop();
  
                m_processor.releaseStylesheet(compiledStylesheet);
                m_processor.releaseInputSource(parsedInputSource);
                m_processor.releaseResultTarget(resultTarget);
  
        
                if (true == testCase.verifyResult)
                {
                        
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("verify"), 
XalanDOMString("yes")));
                        if (checkFileExists(testCase.resultDocument))
                        {
                                if (checkFileExists(testCase.goldResult))
                                {
                                        if 
(m_fileUtility->compareSerializedResults(
                                                        testCase.resultDocument,
                                                        testCase.goldResult))
                                        {
                                                
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("result"), 
XalanDOMString("pass")));
                                        }
                                        else
                                        {
                                                
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("result"), 
XalanDOMString("fail")));
                                        }     
                                }
                                else
                                {
                                        
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("result"), 
XalanDOMString("incomplete")));
                                }
                        }
                        else
                        {
                                
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("result"), 
XalanDOMString("incomplete")));
                        }
                }
                else
                {
                        
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("verify"), 
XalanDOMString("no")));
                }
  
  
                m_reporter->addMetricToAttrs("num-iterations", numIterations, 
testAttributes);
                m_reporter->addMetricToAttrs("elapsed-time", 
timeTotalRun.getElapsedTime(), testAttributes);
                m_reporter->addMetricToAttrs("min-parse-input", 
minParseInputTime, testAttributes);
                m_reporter->addMetricToAttrs("max-parse-input", 
maxParseInputTime, testAttributes);
                m_reporter->addMetricToAttrs("avg-parse-input", 
totalParseInputTime / numIterations, testAttributes);
                m_reporter->addMetricToAttrs("min-transform", minTransformTime, 
testAttributes);
                m_reporter->addMetricToAttrs("max-transform", maxTransformTime, 
testAttributes);
                m_reporter->addMetricToAttrs("avg-transform", 
totalTransformTime / numIterations, testAttributes);
                
                
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("complete"),
 XalanDOMString("yes")));
                
      }
      catch (XalanDOMString exception)
        {
                m_logger->error()  
                                << "Error encountered during transformation: " 
                                << testCase.stylesheet.c_str()
                                << ", error: "
                                << exception.c_str()
                                << endl;
  
                
testAttributes.insert(TestAttributesType::value_type(XalanDOMString("complete"),
 XalanDOMString("no")));
        }
        
        m_reporter->logElementWAttrs(1, "testcase", testAttributes, "");
  }
    
    
  
  template <class Processor>
  TestHarness<Processor>::TestHarness()
  {
  
  }
  
  
  template <class Processor>
  void 
  TestHarness<Processor>::init(
                XalanFileUtility&               fileUtility,
                XalanXMLFileReporter&   reporter,
                Logger&                                 logger)
  {
      m_processor.init();
  
        m_fileUtility = &fileUtility;
  
        m_reporter = &reporter;         
  
        m_logger = &logger;
  }
  
  
  
  template <class Processor>
  void
  TestHarness<Processor>::terminate()
  {
     m_processor.terminate(); 
  }
  
  
  #endif // TESTHARNESS_HEADER_GUARD_1357924680
  
  
  1.1                  xml-xalan/c/Tests/Performance/Timer.hpp
  
  Index: Timer.hpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #if !defined(TIMER_HEADER_GUARD_1357924680)
  #define TIMER_HEADER_GUARD_1357924680
  
  
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <ctime>
  
  
  
  class Timer
  {
  public:
      typedef XALAN_STD_QUALIFIER clock_t       TimerType;
  
      Timer() :
          m_startTime(0),
          m_totalTime(0)
      {
      }
  
    void start()
      {
          m_startTime = XALAN_STD_QUALIFIER clock();
  
      }
  
      TimerType stop()
      {
          TimerType stopTime = XALAN_STD_QUALIFIER clock();
  
          m_totalTime = stopTime - m_startTime;
  
          return m_totalTime;
      }
  
      TimerType getElapsedTime()
      {
          return m_totalTime;
      }
  
  
  private:
  
      TimerType m_startTime;
      TimerType m_totalTime;
      
  };
  
  
  
  
  
  
  #endif TIMER_HEADER_GUARD_1357924680
  
  
  1.1                  xml-xalan/c/Tests/Performance/Utils.cpp
  
  Index: Utils.cpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  
  
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <stdio.h>
  #include <sstream>
  
  
  
  #if defined(WIN32)
  #include <direct.h>
  #define getcwd _getcwd
  #else
  #include <unistd.h>
  #endif
  
  
  
  #include <xalanc/Include/XalanMemoryManagement.hpp>
  
  
  
  #include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  
  
  
  #include "Utils.hpp"
  
  
  
  XALAN_USING_XALAN(XalanMemMgrs)
  XALAN_USING_XALAN(CharVectorType)
  XALAN_USING_XALAN(TranscodeToLocalCodePage)
  XALAN_USING_XALAN(c_str)
  
  XALAN_USING_STD(ostringstream)
  XALAN_USING_STD(fstream)
  XALAN_USING_STD(ofstream)
  
  
  
  bool checkFileExists(const XalanDOMString& fileName)
  {
        CharVectorType     theResult(XalanMemMgrs::getDefaultXercesMemMgr());
      TranscodeToLocalCodePage(fileName, theResult, true);
  
        FILE* fileHandle  = fopen(c_str(theResult), "r");
  
        if (fileHandle != 0)
        {
                fclose(fileHandle);
                return true;
        }
        else
        {
                return false;
        }
  }
  
  
  
  XalanDOMString getWorkingDirectory()
  {
        char path[4096];
        getcwd(path, 4096);
        return XalanDOMString(path);
  }
  
  
  
  const XalanDOMChar* getPathSep()
  {
        return XalanFileUtility::s_pathSep;
  }
  
  
  
  void fileToStream(
          const XalanDOMString&   fileName,
          istringstream&          resultStream)
  {
      CharVectorType resultFileName;
      fileName.transcode(resultFileName);
      fstream resultFile(c_str(resultFileName));
  
      ostringstream fileOutputStream;
  
      char ch; 
  
      while(resultFile.get(ch))
      {
          fileOutputStream.put(ch);
      }
      resultStream.str(fileOutputStream.str());
  }
  
  
  
  void copyFile(
                const XalanDOMString&   destFile,
                const XalanDOMString&   sourceFile)
  {
      CharVectorType sourceFileName;
      sourceFile.transcode(sourceFileName);
      fstream sourceFileStream(c_str(sourceFileName));
  
        CharVectorType destFileName;
      destFile.transcode(destFileName);
      ofstream destFileStream(c_str(destFileName));
  
        char ch;
  
        while (sourceFileStream.get(ch))
        {
                destFileStream.put(ch);
        }
  
        sourceFileStream.close();
        destFileStream.close();
  }
  
  
  1.1                  xml-xalan/c/Tests/Performance/Utils.hpp
  
  Index: Utils.hpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #if !defined(UTILS_HEADER_GUARD_1357924680)
  #define UTILS_HEADER_GUARD_1357924680
  
  
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <fstream>
  
  
  
  #include <xalanc/Harness/XalanFileUtility.hpp>
  
  
  
  #include <xalanc/XalanDOM/XalanDOMString.hpp>
  
  
  
  XALAN_USING_XALAN(XalanDOMChar)
  XALAN_USING_XALAN(XalanDOMString)
  XALAN_USING_XALAN(XalanFileUtility)
  
  XALAN_USING_STD(istringstream)
  
  
  
  /**
   *  Checks if a file exists
   */
  bool checkFileExists(const XalanDOMString& fileName);
  
  
  
  /**
   * Gets the current working directory
   */
  XalanDOMString getWorkingDirectory();
  
  
  
  /**
   * Gets the system path seperator
   */
  const XalanDOMChar* getPathSep();
  
  
  
  /**
   * Reads file into a stream
   */
  void fileToStream(
          const XalanDOMString&   fileName,
          istringstream&          resultStream);
  
  
  /**
   * Copies a file
   */
  void copyFile(
                const XalanDOMString&   destFile,
                const XalanDOMString&   sourceFile);
  
          
  
  #endif UTILS_HEADER_GUARD_1357924680
  
  
  1.1                  xml-xalan/c/Tests/Performance/XalanCProcessor.cpp
  
  Index: XalanCProcessor.cpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  
  #include <iostream>
  
  
  
  using namespace std;
  
  
  
  #include <xalanc/XMLSupport/FormatterToNull.hpp>
  #include <xalanc/XalanSourceTree/FormatterToSourceTree.hpp>
  
  
  
  
  
  #include "XalanCProcessor.hpp"
  
  
  
  XALAN_USING_XERCES(XMLPlatformUtils)
  XALAN_USING_XALAN(XalanTransformer)
  XALAN_USING_XALAN(XalanMemMgrs)
  
  
  typedef XalanCProcessor::CompiledStylesheetType CompiledStylesheetType;
  typedef XalanCProcessor::ParsedInputSourceType        ParsedInputSourceType;
  typedef XalanCProcessor::ResultTargetType       ResultTargetType;
  
  typedef XalanCProcessor::ParseOptionType        ParseOptionType;
  typedef XalanCProcessor::ResultTarget           ResultTarget;
  
  
  
  
  
  XalanCProcessor::XalanCProcessor() :
      m_resultOptionsMap(XalanMemMgrs::getDefaultXercesMemMgr()),
        m_name("Xalan")
  {
  }
  
  XalanCProcessor::~XalanCProcessor()
  {
  }
  
  
  
  void
  XalanCProcessor::init()
  {
      m_transformer = new XalanTransformer();
  
        m_resultOptionsMap[XalanDOMString("")] = &m_fileResult;
      m_resultOptionsMap[XalanDOMString("file")] = &m_fileResult;
      m_resultOptionsMap[XalanDOMString("xst")] = &m_xalanSourceTreeResult;
      m_resultOptionsMap[XalanDOMString("xerces-dom")] = &m_xercesDOMResult;
      m_resultOptionsMap[XalanDOMString("null")] = &m_nullResult;
      m_resultOptionsMap[XalanDOMString("stream")] = &m_streamResult;
  }
  
  
  
  void
  XalanCProcessor::terminate()
  {
       delete m_transformer;
  }
  
  
  
  ParseOptionType  
  XalanCProcessor::getParseOption(const XalanNode* option)
  {
      if (option != 0 
          && option->getNodeType() == XalanNode::TEXT_NODE)
      {
          if (option->getNodeValue() == XalanDOMString("") 
              || option->getNodeValue() == XalanDOMString("xst"))
          {
              return eXalanSourceTree;
          }
          else if (option->getNodeValue() == XalanDOMString("xerces-dom"))
          {
              return eXercesDOM;
          }
          else 
          {
              return eInvalid;
          }
      }
      else
      {
          return eInvalid;
      }
  }
  
   
  
  ResultTarget*
  XalanCProcessor::getResultOption(
      const XalanDOMString& fileName,
      const XalanNode* option)
  {
      if (option != 0 
          && option->getNodeType() == XalanNode::TEXT_NODE
          && m_resultOptionsMap.find(option->getNodeValue()) != 
m_resultOptionsMap.end())
      {
          return m_resultOptionsMap[option->getNodeValue()]->clone(fileName);
      }
      else
      {
          return m_resultOptionsMap[XalanDOMString("")]->clone(fileName);
      }
  }
  
  
  
  CompiledStylesheetType 
  XalanCProcessor::compileStylesheet(
        const XalanDOMString& fileName,
      const XalanNode* /* compileOptions */)
  {     
      CompiledStylesheetType theCompiledStylesheet= 0;
      m_transformer->compileStylesheet(fileName, theCompiledStylesheet);
      return theCompiledStylesheet;
  }
  
  
  
  CompiledStylesheetType 
  XalanCProcessor::compileStylesheet(
        StreamType& stream,
      const XalanNode* /* compileOptions */)
  {
      CompiledStylesheetType theCompiledStylesheet = 0;
      m_transformer->compileStylesheet(stream, theCompiledStylesheet);
      return theCompiledStylesheet;
  }
  
  
  
  void
  XalanCProcessor::releaseStylesheet(CompiledStylesheetType stylesheet)
  {
      m_transformer->destroyStylesheet(stylesheet);
  }
  
        
  
  ParsedInputSourceType
  XalanCProcessor::parseInputSource(
        const XalanDOMString& fileName,
        const XalanNode* parseOptions )
  {
      ParsedInputSourceType theParsedSource = 0;
      switch(getParseOption(parseOptions))
      {
          case eXercesDOM:
              m_transformer->parseSource(fileName, theParsedSource, true);
              break;
          case eXalanSourceTree:
          default:
              m_transformer->parseSource(fileName, theParsedSource);
              break;
      }
          
      return theParsedSource;
  }
  
  
  
  ParsedInputSourceType 
  XalanCProcessor::parseInputSource(
        StreamType& stream,
        const XalanNode* parseOptions)
  {
      ParsedInputSourceType theParsedSource = 0;
      switch(getParseOption(parseOptions))
      {
          case eXercesDOM:
              m_transformer->parseSource(stream, theParsedSource, true);
              break;
          case eXalanSourceTree:
          default:
              m_transformer->parseSource(stream, theParsedSource);
              break;
      }
          
      return theParsedSource;
  
  }
  
  
  
  void
  XalanCProcessor::releaseInputSource(ParsedInputSourceType inputSource)
  {
      m_transformer->destroyParsedSource(inputSource);
  }
  
  
  
  ResultTargetType
  XalanCProcessor::createResultTarget(
      const XalanDOMString& resultFileName,
        const XalanNode* resultOptions)
  {
      return getResultOption(resultFileName, resultOptions);
  }
  
  
  
  void
  XalanCProcessor::releaseResultTarget(ResultTargetType resultTarget)
  {
      delete resultTarget;
  }
  
  
  
  
  void 
  XalanCProcessor::transform(
        const CompiledStylesheetType&   compiledStylesheet,
        const ParsedInputSourceType&    parsedInputSourceType,
        const ResultTargetType&         resultTargetType,
      const XalanNode* /* transformOptions */)
  {
      m_transformer->transform(*parsedInputSourceType, compiledStylesheet, 
resultTargetType->resultTarget);
  }
  
  
  
  
  
  
  1.1                  xml-xalan/c/Tests/Performance/XalanCProcessor.hpp
  
  Index: XalanCProcessor.hpp
  ===================================================================
  /*
   * Copyright 1999-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.
   */
  #if !defined(XALANCRPROCESSOR_HEADER_GUARD_1357924680)
  #define XALANCRPROCESSOR_HEADER_GUARD_1357924680
  
  // Base header file.  Must be first.
  #include <xalanc/Include/PlatformDefinitions.hpp>
  
  
  
  #include <sstream>
  #include <istream>
  
  
  
  #include <xercesc/dom/DOMDocument.hpp>
  
  
  
  #include <xalanc/Include/XalanMap.hpp>
  
  
  
  #include <xalanc/PlatformSupport/DOMStringHelper.hpp>
  
  
  
  
  #include <xalanc/XMLSupport/FormatterToNull.hpp>
  
  
  
  #include <xalanc/XalanSourceTree/FormatterToSourceTree.hpp>
  #include <xalanc/XalanSourceTree/XalanSourceTreeDocument.hpp>
  
  
  
  #include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>
  #include <xalanc/XercesParserLiaison/FormatterToXercesDOM.hpp>
  
  
  
  #include <xalanc/XalanTransformer/XalanTransformer.hpp>
  
  
  
  #include <xalanc/XalanDOM/XalanDOMString.hpp>
  
  
  
  XALAN_USING_XERCES(DOMDocument);
  XALAN_CPP_NAMESPACE_USE
  
  
  
  /**
   * Implementation of the test interface for XalanC 1.x
   *
   */
  class XalanCProcessor
  {
  public:
  
      XalanDOMString m_name;
  
        typedef XalanCompiledStylesheet*        CompiledStylesheetType;
        typedef XalanParsedSource*              ParsedInputSourceType;
  
      struct ResultTarget {
          XSLTResultTarget resultTarget;
  
          virtual ResultTarget* clone(const XalanDOMString&) = 0;
          virtual void reset() = 0;
      };
  
        typedef ResultTarget*           ResultTargetType;
  
      typedef XSLTInputSource::StreamType StreamType;
  
        XalanCProcessor();
      ~XalanCProcessor();
  
  
  
        /**
         * Initializes the processor interface.
         * Assumes static processor initialization functions are already 
completed.
         */
      void
      init();
  
  
  
        /**
         * Terminates the processor interface.
         */
      void
      terminate();
  
  
  
        /**
         *  Returns the name of the processor implementation.
         *  @returns name of the processor
         */
      XalanDOMString& getName() { return m_name;}
  
  
  
        /** 
         *  Compiles the specified stylesheet.
         *  Xalan interface does not support any options.
         *  @param fileName stylesheet to compile
         *  @param compileOptions (none for this interface)
         *  @returns compiled stylesheet
         */
        CompiledStylesheetType 
        compileStylesheet(
                const XalanDOMString& fileName,
          const XalanNode* compileOptions = 0);
  
  
  
        /** 
         *  Compiles the specified stylesheet.
         *  Xalan interface does not support any options.
         *  @param stream stylesheet to compile
         *  @param compileOptions (none for this interface)
         *  @returns compiled stylesheet
         */
        CompiledStylesheetType 
        compileStylesheet(
                StreamType& stream,
          const XalanNode* compileOptions = 0);
  
  
        /**
         *  Release stylesheet object
         *  @param stylesheet object to release
         */
      void
      releaseStylesheet(CompiledStylesheetType stylesheet);
        
  
  
        /**
         * Parses an input document.
         * Parse options, a text node containing:<ul>
         * <li><b>xst</b>: parse to XalanSourceTree (default)
         * <li><b>xerces-dom</b>: parse to XercesDOM</ul>
         * @param fileName input document to parse.
         * @param parseOptions  options to the parser.
         * @returns parsed document
         */
        ParsedInputSourceType
        parseInputSource(
                const XalanDOMString& fileName,
                const XalanNode* parseOptions = 0);
  
  
  
        /**
         * Parses an input document.
         * Parse options, a text node containing:<ul>
         * <li><b>xst</b>: parse to XalanSourceTree (default)
         * <li><b>xerces-dom</b>: parse to XercesDOM</ul>
         * @param stream input document to parse.
         * @param parseOptions  options to the parser.
         * @returns parsed document
         */
        ParsedInputSourceType 
        parseInputSource(
                StreamType& stream,
                const XalanNode* parseOptions = 0);
  
  
  
        /**
         * Releases and parsed input source
         * @param inputSource source to release
         */
      void
      releaseInputSource(ParsedInputSourceType inputSource);
  
  
  
        /**
         * Creates a result target.
         * Result target options, a text node containing:<ul>
         * <li><b>file</b>: result to a file (default)</li>
         * <li><b>xst</b>: result to a XalanSourceTree</li>
         * <li><b>xerces-dom</b>: result to XercesDOM</li>
         * <li><b>null</b>:  generate no result</li>
         * <li><b>stream</b>: result to a stream (string)</li></ul>
         * @param resultFileName file to write result to, if any
         * @param resultOptions  options to create result
         * @return result target
         */
        ResultTargetType
        createResultTarget(
          const XalanDOMString& resultFileName,
                const XalanNode* resultOptions = 0);
  
  
        
        /**
         * Releases result target
         * @param resultTarget target to release
         */
      void
      releaseResultTarget(ResultTargetType resultTarget);
  
  
  
        /**
         * Executes a transform
         * @param compileStyle stylesheet
         * @param parsedInputSourceType parsed document
         * @param resultTargetType result target
         * @param transformOptions (none for this interface)
         */
        void transform(
                const CompiledStylesheetType&   compiledStylesheet,
                const ParsedInputSourceType&    parsedInputSourceType,
                const ResultTargetType&         resultTargetType,
          const XalanNode* transformOptions = 0);
  
        typedef enum {eInvalid, eXalanSourceTree, eXercesDOM} ParseOptionType;
  
  protected:
  
      ParseOptionType  getParseOption(const XalanNode* option);
  
      typedef XalanMap<XalanDOMString, ResultTarget*>  ResultsMapType;
  
      ResultTarget* getResultOption(
          const XalanDOMString& fileName,
          const XalanNode* option);    
  
      ResultsMapType      m_resultOptionsMap;
  
      XalanTransformer    *m_transformer;
  
      
      struct NullResult : public ResultTarget
      {
          NullResult()
          {
              resultTarget.setFormatterListener(&formatterToNull);
          }
          
          ResultTarget * 
          clone(const XalanDOMString&) { return new NullResult;}
          
          void reset() {}
  
          FormatterToNull formatterToNull;
      };
  
      NullResult m_nullResult;
  
      struct XalanSourceTreeResult : public ResultTarget
      {
          XalanSourceTreeResult() :
              document(XalanMemMgrs::getDefaultXercesMemMgr())
          {
              formatterToSourceTree.setDocument(&document);
              resultTarget.setFormatterListener(&formatterToSourceTree);
          }
  
          ResultTarget * 
          clone(const XalanDOMString&) { return new XalanSourceTreeResult;}
  
          void reset() { formatterToSourceTree.resetDocument();}
  
  
          FormatterToSourceTree   formatterToSourceTree;
          XalanSourceTreeDocument document;
      };
  
      XalanSourceTreeResult m_xalanSourceTreeResult;
  
      struct XercesDOMResult : public ResultTarget
      {
          XercesDOMResult() :
                  parserLiaison(),
                  document(parserLiaison.createDOMFactory()),
                  formatterToXercesDOM(document, 0)
          {
          }
  
          ResultTarget *
          clone(const XalanDOMString&) { return new XercesDOMResult;}
  
          void reset() { formatterToXercesDOM.resetDocument();}
  
          XercesParserLiaison     parserLiaison;
          DOMDocument*            document;
          FormatterToXercesDOM    formatterToXercesDOM;
  
      };
  
      XercesDOMResult m_xercesDOMResult;
  
      struct FileResult : public ResultTarget
      {
          FileResult(const XalanDOMString & fileName = XalanDOMString(""))
          {
              resultTarget.setFileName(fileName);
          }
  
          ResultTarget *
          clone(const XalanDOMString& fileName) { return new 
FileResult(fileName);}
  
          void reset() {}
  
      };
  
      FileResult  m_fileResult;
  
      struct StreamResult : public XalanCProcessor::ResultTarget
      {
          StreamResult()
          {
              resultTarget.setByteStream(&stringstream);
          }
  
          ResultTarget *
          clone(const XalanDOMString&) { return new StreamResult;}
  
          void reset() { stringstream.flush();}
  
          XALAN_STD_QUALIFIER ostringstream stringstream;
      };
  
      StreamResult    m_streamResult;
  
  };
  
  #endif // XALANCRPROCESSOR_HEADER_GUARD_1357924680
  
  
  1.1                  xml-xalan/c/Tests/Performance/comparereport.xsl
  
  Index: comparereport.xsl
  ===================================================================
  <?xml version="1.0"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="1.0"> 
        <xsl:output method="html"/>
        <xsl:param name="baseline" select="'R2.xml'"/>
        <xsl:param name="threshold" select="5"/>
  
        <xsl:template match="/">
                <html>
                        <title>Comparison Result Report</title>
                        <body>
                                <xsl:apply-templates/>
                        </body>
                </html>
        </xsl:template>
        
        <xsl:template match="resultsfile">
                        <table border="1">
                        <tr>
                                <td>
                                        <b>Filename:</b>
                                </td>
                                <td>
                                        <xsl:value-of select="@filename"/>
                                </td>
                        </tr>
                        <tr>
                                <td>
                                        <b>Description:</b>
                                </td>
                                <td>
                                        <xsl:value-of select="testfile/@desc"/>
                                </td>
                        </tr>
                        <tr>
                                <td>
                                        <b>Time:</b>
                                </td>
                                <td>
                                        <xsl:value-of select="testfile/@time"/>
                                </td>
                        </tr>
                </table>
                <P/>
                <xsl:apply-templates/>
        </xsl:template>
        <xsl:template match="testfile">
                <table border='1'>
                        <tr>
                                <td><b>Stylesheet</b></td>
                                <td><b>Verify</b></td>
                                <td><b>Result</b></td>
                                <td><b>Time to compile</b></td>
                                <td><b>Iterations</b></td>
                                <td><b>Total transform time</b></td>
                                <td><b>Min. parse input</b></td>
                                <td><b>Avg. parse input</b></td>
                                <td><b>Max. parse input</b></td>
                                <td><b>Min. transform</b></td>
                                <td><b>Avg. transform</b></td>
                                <td><b>Max. transform</b></td>
                        </tr>
  
                        <xsl:apply-templates/>
                </table>
        </xsl:template>
  
        <xsl:template match="testcase">
                        <tr>
                                <td colspan='12'> </td>
                        </tr>
                        <tr>
                        <xsl:variable name="ss" select="@stylesheet"/>
                        <xsl:variable name="baselineTestCase" 
select="document($baseline)/resultsfile/testfile/testcase[attribute::stylesheet 
= $ss]"/> 
                        <tr>
                                <td><xsl:value-of select="@stylesheet"/></td>
                                <td><xsl:value-of select="@verify"/></td>
                                <td><xsl:value-of select="@result"/></td>
                                <td><xsl:value-of select="@compile-xsl"/></td>
                                <td><xsl:value-of 
select="@num-iterations"/></td>
                                <td><xsl:value-of select="@elapsed-time"/></td>
                                <td><xsl:value-of 
select="@min-parse-input"/></td>
                                <td><xsl:value-of 
select="@avg-parse-input"/></td>
                                <td><xsl:value-of 
select="@max-parse-input"/></td>
                                <td><xsl:value-of select="@min-transform"/></td>
                                <td><xsl:value-of select="@avg-transform"/></td>
                                <td><xsl:value-of select="@max-transform"/></td>
                        </tr>
                                <td>Baseline</td>
                                <td><xsl:value-of 
select="$baselineTestCase/@verify"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@result"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@compile-xsl"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@num-iterations"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@elapsed-time"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@min-parse-input"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@avg-parse-input"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@max-parse-input"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@min-transform"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@avg-transform"/></td>
                                <td><xsl:value-of 
select="$baselineTestCase/@max-transform"/></td>
                        </tr>
                        <tr>
                                <xsl:variable name="ss" select="@stylesheet"/>
                                <xsl:variable name="baselineTestCase" 
select="document($baseline)/resultsfile/testfile/testcase[attribute::stylesheet 
= $ss]"/> 
                                <td>Difference:</td>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@verify"/>
                                        <xsl:with-param name="new" 
select="@verify"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@result"/>
                                        <xsl:with-param name="new" 
select="@result"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@compile-xsl"/>
                                        <xsl:with-param name="new" 
select="@compile-xsl"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="new" 
select="$baselineTestCase/@num-iterations"/>
                                        <xsl:with-param name="orig" 
select="@num-iterations"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@elapsed-time"/>
                                        <xsl:with-param name="new" 
select="@elapsed-time"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@min-parse-input"/>
                                        <xsl:with-param name="new" 
select="@min-parse-input"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@avg-parse-input"/>
                                        <xsl:with-param name="new" 
select="@avg-parse-input"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@max-parse-input"/>
                                        <xsl:with-param name="new" 
select="@max-parse-input"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@min-transform"/>
                                        <xsl:with-param name="new" 
select="@min-transform"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@avg-transform"/>
                                        <xsl:with-param name="new" 
select="@avg-transform"/>
                                </xsl:call-template>
                                <xsl:call-template name="HighlightChange">
                                        <xsl:with-param name="orig" 
select="$baselineTestCase/@max-transform"/>
                                        <xsl:with-param name="new" 
select="@max-transform"/>
                                </xsl:call-template>
                        </tr>
        </xsl:template>
  
        
        
        <xsl:template name="HighlightChange">
                <xsl:param name="orig"/>
                <xsl:param name="new"/>
  
                <xsl:choose>
                        <xsl:when test="number($orig) or $orig = 0">
  
                                <xsl:variable name="n-orig">
                                        <xsl:choose>
                                                <xsl:when test="$orig= 0">
                                                        <xsl:value-of 
select="1"/>
                                                </xsl:when>
                                                <xsl:otherwise>
                                                        <xsl:value-of 
select="$orig"/>
                                                </xsl:otherwise>
                                        </xsl:choose>
                                </xsl:variable>
                        
                                <xsl:variable name="n-new">
                                        <xsl:choose>
                                                <xsl:when test="$new= 0">
                                                        <xsl:value-of 
select="1"/>
                                                </xsl:when>
                                                <xsl:otherwise>
                                                        <xsl:value-of 
select="$new"/>
                                                </xsl:otherwise>
                                        </xsl:choose>
                                </xsl:variable>
  
                                <xsl:choose>
                                        <xsl:when test="$n-new > $n-orig">
                                                <xsl:variable name="difference" 
select="(($n-new div $n-orig) - 1) * 100"/>
                                                <xsl:choose>
                                                        <xsl:when 
test="$difference > ($threshold div 100)">
                                                                <td 
bgcolor="red">
                                                                        
<xsl:value-of select="concat($difference,'%')"/>
                                                                </td>   
                                                        </xsl:when>
                                                        <xsl:otherwise>
                                                                <td>
                                                                        
<xsl:value-of select="concat($difference,'%')"/>
                                                                </td>
                                                        </xsl:otherwise>
                                                </xsl:choose>
                                        </xsl:when>
                                        <xsl:otherwise>
                                                <xsl:variable name="difference" 
select="(1 - ($n-new div $n-orig)) * 100"/>
                                                <xsl:choose>
                                                        <xsl:when 
test="$difference > ($threshold div 100)">
                                                                <td 
bgcolor="#10F0F0">
                                                                        
<xsl:value-of select="concat($difference,'%')"/>
                                                                </td>
                                                        </xsl:when>
                                                        <xsl:otherwise>
                                                                <td>
                                                                        
<xsl:value-of select="concat($difference,'%')"/>
                                                                </td>
                                                        </xsl:otherwise>
                                                </xsl:choose>
                                        </xsl:otherwise>
                                </xsl:choose>           
                        </xsl:when>
                        <xsl:otherwise>
                                <xsl:choose>
                                        <xsl:when test="$orig = $new">
                                                <td>Same</td>
                                        </xsl:when>
                                        <xsl:otherwise>
                                                <td bgcolor="red">Diff</td>
                                        </xsl:otherwise>
                                </xsl:choose>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
  </xsl:stylesheet>
  
                
                
                
  
  
  
  1.1                  xml-xalan/c/Tests/Performance/config.xml
  
  Index: config.xml
  ===================================================================
  <?xml version="1.0"?>
  <!-- Test configuration file that describes the testing parameters -->
  <testconfig name="DefaultRun">
        <description>This is a sample test configuratoin file</description>
        
        <!-- Location to place results along with Report name prefix.
                     Default is the working directory.  -->
        <results file-path="SampleTestRunResults">ResultReport</results>
  
        <!-- Location where previous result to be used for comparison is 
located.
             Threshold is percentage of variance to highlight.
             Default is the working directory -->
        <!--<baseline threshold="5" 
file-path="BaseLineResults">Standard.xml</baseline> -->
  
        <!-- Parameters for the test cases:
                num-iterations          number of iterations 
                min-time-to-execute     minimum time of process (milliseconds)
                verify-result           compare against the gold file (yes|no)
                input-mode              mode to provide input (file|stream) -->
        <default-parameter-set 
                num-iterations="10" 
                min-time-to-execute="1"
                input-mode="stream" 
                verify-result="yes">
                <!-- Init options: N/A at this time -->
                <!-- <init-options/> -->
                
                <!-- Compile options: N/A at this time -->
                <!-- <compile-options/> -->
                
                <!-- Parse options for Xalan:
                        xst             XalanSourceTree (default)
                        xerces-dom      XercesDOM -->
                <!-- <parse-options processor="Xalan">xst</parse-options> -->
  
                <!-- Result options for Xalan:
                        file            File (default)
                        xst             XalanSourceTree
                        xerces-dom      XercesDOM
                        null            Null
                        stream          Stream -->
                <!-- <result-options processor="Xalan">file</result-options> -->
  
                <!-- Transform options: N/A at this time -->    
                <!-- <transform-options processor="Xalan"/> -->                 
        </default-parameter-set>
  </testconfig>
  
  
                
                
                
  
  
  
  1.1                  xml-xalan/c/Tests/Performance/report.xsl
  
  Index: report.xsl
  ===================================================================
  <?xml version="1.0"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="1.0"> 
        <xsl:output method="html"/>
        <xsl:template match="/">
                <html>
                        <title>Result Report</title>
                        <body>
                                <xsl:apply-templates/>
                        </body>         
                </html>
        </xsl:template>
        
        <xsl:template match="resultsfile">
                <table border="1">
                        <tr>
                                <td>
                                        <b>Filename:</b>
                                </td>
                                <td>
                                        <xsl:value-of select="@filename"/>
                                </td>
                        </tr>
                        <tr>
                                <td>
                                        <b>Description:</b>
                                </td>
                                <td>
                                        <xsl:value-of select="testfile/@desc"/>
                                </td>
                        </tr>
                        <tr>
                                <td>
                                        <b>Time:</b>
                                </td>
                                <td>
                                        <xsl:value-of select="testfile/@time"/>
                                </td>
                        </tr>
                </table>
                <P/>
                <xsl:apply-templates/>
        </xsl:template>
  
        <xsl:template match="testfile">
                <table border='1'>
                        <tr>
                                <td><b>Stylesheet</b></td>
                                <td><b>Verify</b></td>
                                <td><b>Result</b></td>
                                <td><b>Time to compile</b></td>
                                <td><b>Iterations</b></td>
                                <td><b>Total transform time</b></td>
                                <td><b>Min. parse input</b></td>
                                <td><b>Avg. parse input</b></td>
                                <td><b>Max. parse input</b></td>
                                <td><b>Min. transform</b></td>
                                <td><b>Avg. transform</b></td>
                                <td><b>Max. transform</b></td>
                        </tr>
  
                        <xsl:apply-templates/>
                </table>
        </xsl:template>
  
        <xsl:template match="testcase">
                <tr>
                        <td><xsl:value-of select="@stylesheet"/></td>
                        <td><xsl:value-of select="@verify"/></td>
                        <td><xsl:value-of select="@result"/></td>
                        <td><xsl:value-of select="@compile-xsl"/></td>
                        <td><xsl:value-of select="@num-iterations"/></td>
                        <td><xsl:value-of select="@elapsed-time"/></td>
                        <td><xsl:value-of select="@min-parse-input"/></td>
                        <td><xsl:value-of select="@avg-parse-input"/></td>
                        <td><xsl:value-of select="@max-parse-input"/></td>
                        <td><xsl:value-of select="@min-transform"/></td>
                        <td><xsl:value-of select="@avg-transform"/></td>
                        <td><xsl:value-of select="@max-transform"/></td>
                </tr>
        </xsl:template>
  
  </xsl:stylesheet>
  
                
                
                
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to