in java/src/org/apache/qetest/trax/TestMultiTypeThreads.java [728:886]
public void run()
{
int i = 0; // loop counter; used for error reporting
createErrWriter();
println("<?xml version=\"1.0\"?>");
println("<testrunner desc=\"" + runnerID + ":started\" fileName=\""
+ xslName + "\">");
TransformerFactory factory = null;
try
{
// Each runner creates it's own processor for use and it's own error log
factory = TransformerFactory.newInstance();
println("<arbitrary desc=\"" + runnerID + ":processing\">");
}
catch (Throwable ex)
{ // If we got here, just log it and bail, no sense continuing
println("<throwable desc=\"" + ex.toString() + "\"><![CDATA[");
ex.printStackTrace(errWriter);
println("\n</throwable>");
println("<message desc=\"" + runnerID + ":complete-ERROR:after:"
+ i + "\"/>");
println("</testrunner>");
if (errWriter != null)
errWriter.close();
return;
}
try
{
// Loop away...
for (i = 0; i < numProcesses; i++)
{
// Run a process using the pre-compiled stylesheet we were construced with
{
Transformer transformer1 = xslStylesheet.newTransformer();
if (transformType == DOMSource.FEATURE)
{
doDOMTransform(transformer1, xmlName, outName + "d.out", "d");
}
else if (transformType == SAXSource.FEATURE)
{
doSAXTransform(xslName, xmlName, outName + "x.out", "x");
}
else if (transformType == StreamSource.FEATURE)
{
// Call String ctor so we don't have to setSystemId
Result result1 = new StreamResult(outName + "t.out");
if (setParam)
transformer1.setParameter(paramName, paramVal);
print("t"); // Note presence of this in logs shows which process threw an exception
transformer1.transform(new StreamSource(xmlName), result1);
}
else
{
throw new RuntimeException("unsupported transformType: " + transformType);
}
// Temporary vars go out of scope for cleanup here
}
// Now process something with a newly-processed stylesheet
{
Templates templates2 =
factory.newTemplates(new StreamSource(xslName));
Transformer transformer2 = templates2.newTransformer();
if (transformType == DOMSource.FEATURE)
{
doDOMTransform(transformer2, xmlName, outName + "_D.out", "D");
}
else if (transformType == SAXSource.FEATURE)
{
doSAXTransform(xslName, xmlName, outName + "_X.out", "X");
}
else // if (transformType == StreamSource.FEATURE)
{
Result result2 = new StreamResult(outName + "_T.out");
if (setParam)
transformer2.setParameter(paramName, paramVal);
print("T"); // Note presence of this in logs shows which process threw an exception
transformer2.transform(new StreamSource(xmlName), result2);
}
}
// if asked, report memory statistics
if (reportMem)
{
Runtime r = Runtime.getRuntime();
r.gc();
long freeMemory = r.freeMemory();
long totalMemory = r.totalMemory();
println("<statistic desc=\"" + runnerID
+ ":memory:longval-free:doubleval-total\">");
println("<longval>" + freeMemory + "</longval>");
println("<doubleval>" + totalMemory + "</doubleval>");
println("</statistic>");
}
// if we're polite, let others play for a bit
if (polite)
java.lang.Thread.yield();
}
// IF we get here, we worked without exceptions (presumably successfully)
println("</arbitrary>");
println("<message desc=\"" + runnerID + ":complete-OK:after:"
+ numProcesses + "\"/>");
}
// Separate messages for each kind of exception
catch (TransformerException te)
{
println("\n<TransformerException desc=\"" + te.toString() + "\">");
logStackTrace(te, errWriter);
logContainedException(te, errWriter);
println("</TransformerException>");
println("</arbitrary>");
println("<message desc=\"" + runnerID + ":complete-ERROR:after:"
+ i + "\"/>");
}
catch (Throwable ex)
{
logThrowable(ex, errWriter);
println("</arbitrary>");
println("<message desc=\"" + runnerID + ":complete-ERROR:after:"
+ i + "\"/>");
}
finally
{
// Cleanup our references, etc.
println("</testrunner>");
if (errWriter != null)
errWriter.close();
runnerID = null;
xmlName = null;
xslName = null;
xslStylesheet = null;
outName = null;
}
} // end of run()...