/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
/*
* $Id$
*/
package org.apache.qetest.xslwrapper;
import java.util.Properties;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.qetest.QetestUtils;
/**
* Implementation of TransformWrapper that uses the TrAX API and
* uses systemId URL's for it's sources; plus always transforms
* the xml file three times.
*
* This is the most common usage:
* transformer = factory.newTransformer(new StreamSource(xslURL));
* transformer.transform(new StreamSource(xmlURL), new StreamResult(resultFileName));
*
* Important! The underlying System property of
* javax.xml.transform.TransformerFactory will determine the actual
* TrAX implementation used. This value will be reported out in
* our getProcessorInfo() method.
*
* @author Shane Curcuru
* @version $Id$
*/
public class TraxSystemId3Wrapper extends TraxSystemIdWrapper
{
/**
* Get a general description of this wrapper itself.
*
* @return Uses TrAX to perform THREE transforms from StreamSource(systemId)
*/
public String getDescription()
{
return "Uses TrAX to perform THREE transforms from StreamSource(systemId)";
}
/**
* Get a specific description of the wrappered processor.
*
* @return specific description of the underlying processor or
* transformer implementation: this should include both the
* general product name, as well as specific version info. If
* possible, should be implemented without actively creating
* an underlying processor.
*/
public Properties getProcessorInfo()
{
Properties p = TraxWrapperUtils.getTraxInfo();
p.put("traxwrapper.method", "systemId3");
p.put("traxwrapper.desc", getDescription());
return p;
}
/**
* Transform supplied xmlName file with the stylesheet in the
* xslName file into a resultName file three times.
*
* Names are assumed to be local path\filename references, and
* will be converted to URLs as needed for any underlying
* processor implementation.
*
* @param xmlName local path\filename of XML file to transform
* @param xslName local path\filename of XSL stylesheet to use
* @param resultName local path\filename to put result in
*
* @return array of longs denoting timing of only these parts of
* our operation: IDX_OVERALL, IDX_XSLBUILD, IDX_TRANSFORM
*
* @throws Exception any underlying exceptions from the
* wrappered processor are simply allowed to propagate; throws
* a RuntimeException if any other problems prevent us from
* actually completing the operation
*/
public long[] transform(String xmlName, String xslName, String resultName)
throws Exception
{
preventFootShooting();
long startTime = 0;
long xslBuild = 0;
long transform = 0;
// Timed: read/build xsl from a URL
startTime = System.currentTimeMillis();
Transformer transformer = factory.newTransformer(
new StreamSource(QetestUtils.filenameToURL(xslName)));
xslBuild = System.currentTimeMillis() - startTime;
// Untimed: Set any of our options as Attributes on the transformer
TraxWrapperUtils.setAttributes(transformer, newProcessorOpts);
// Untimed: Apply any parameters needed
applyParameters(transformer);
// Timed: read/build xml, transform, and write results
startTime = System.currentTimeMillis();
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
transform = System.currentTimeMillis() - startTime;
// Only time the first transform, but do two more
// This is to test transformer re-use
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
long[] times = getTimeArray();
times[IDX_OVERALL] = xslBuild + transform;
times[IDX_XSLBUILD] = xslBuild;
times[IDX_TRANSFORM] = transform;
return times;
}
/**
* Transform supplied xmlName file with a pre-built/pre-compiled
* stylesheet into a resultName file three times.
*
* User must have called buildStylesheet(xslName) beforehand,
* obviously.
* Names are assumed to be local path\filename references, and
* will be converted to URLs as needed.
*
* @param xmlName local path\filename of XML file to transform
* @param resultName local path\filename to put result in
*
* @return array of longs denoting timing of only these parts of
* our operation: IDX_OVERALL, IDX_XSLBUILD, IDX_TRANSFORM
*
* @throws Exception any underlying exceptions from the
* wrappered processor are simply allowed to propagate; throws
* a RuntimeException if any other problems prevent us from
* actually completing the operation; throws an
* IllegalStateException if isStylesheetReady() == false.
*
* @see #buildStylesheet(String xslName)
*/
public long[] transformWithStylesheet(String xmlName, String resultName)
throws Exception
{
if (!isStylesheetReady())
throw new IllegalStateException("transformWithStylesheet() when isStylesheetReady() == false");
preventFootShooting();
long startTime = 0;
long transform = 0;
// UNTimed: get Transformer from Templates
Transformer transformer = builtTemplates.newTransformer();
// Untimed: Set any of our options as Attributes on the transformer
TraxWrapperUtils.setAttributes(transformer, newProcessorOpts);
// Untimed: Apply any parameters needed
applyParameters(transformer);
// Timed: read/build xml, transform, and write results
startTime = System.currentTimeMillis();
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
transform = System.currentTimeMillis() - startTime;
// Only time the first transform, but do two more
// This is to test transformer re-use
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
long[] times = getTimeArray();
times[IDX_OVERALL] = transform;
times[IDX_TRANSFORM] = transform;
return times;
}
/**
* Transform supplied xmlName file with a stylesheet found in an
* xml-stylesheet PI into a resultName file.
*
* Names are assumed to be local path\filename references, and
* will be converted to URLs as needed. Implementations will
* use whatever facilities exist in their wrappered processor
* to fetch and build the stylesheet to use for the transform.
*
* @param xmlName local path\filename of XML file to transform
* @param resultName local path\filename to put result in
*
* @return array of longs denoting timing of only these parts of
* our operation: IDX_OVERALL, IDX_XSLREAD (time to find XSL
* reference from the xml-stylesheet PI), IDX_XSLBUILD, (time
* to then build the Transformer therefrom), IDX_TRANSFORM
*
* @throws Exception any underlying exceptions from the
* wrappered processor are simply allowed to propagate; throws
* a RuntimeException if any other problems prevent us from
* actually completing the operation
*/
public long[] transformEmbedded(String xmlName, String resultName)
throws Exception
{
preventFootShooting();
long startTime = 0;
long xslRead = 0;
long xslBuild = 0;
long transform = 0;
// Timed: readxsl from the xml document
startTime = System.currentTimeMillis();
Source xslSource = factory.getAssociatedStylesheet(new StreamSource(QetestUtils.filenameToURL(xmlName)),
null, null, null);
xslRead = System.currentTimeMillis() - startTime;
// Timed: build xsl from a URL
startTime = System.currentTimeMillis();
Transformer transformer = factory.newTransformer(xslSource);
xslBuild = System.currentTimeMillis() - startTime;
// Untimed: Set any of our options as Attributes on the transformer
TraxWrapperUtils.setAttributes(transformer, newProcessorOpts);
// Untimed: Apply any parameters needed
applyParameters(transformer);
// Timed: read/build xml, transform, and write results
startTime = System.currentTimeMillis();
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
transform = System.currentTimeMillis() - startTime;
// Only time the first transform, but do two more
// This is to test transformer re-use
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
transformer.transform(new StreamSource(QetestUtils.filenameToURL(xmlName)),
new StreamResult(resultName));
long[] times = getTimeArray();
times[IDX_OVERALL] = xslRead + xslBuild + transform;
times[IDX_XSLREAD] = xslRead;
times[IDX_XSLBUILD] = xslBuild;
times[IDX_TRANSFORM] = transform;
return times;
}
}