--- /dev/null 2014-09-08 10:45:56.830930409 -0700 +++ new/test/javax/xml/jaxp/libs/org/apache/qetest/xslwrapper/TraxSystemId3Wrapper.java 2014-12-31 11:41:21.385150593 -0800 @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + */ +/* + * 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. + */ +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 static jaxp.library.JAXPTestUtilities.filenameToURL; + +/** + * 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. + */ +public class TraxSystemId3Wrapper extends TraxSystemIdWrapper { + + /** + * Get a general description of this wrapper itself. + * + * @return Uses TrAX to perform THREE transforms from StreamSource(systemId) + */ + @Override + 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. + */ + @Override + 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 + * + * @throws Exception any underlying exceptions from the wrapped processor + * are simply allowed to propagate; throws a RuntimeException if any other + * problems prevent us from actually completing the operation + */ + @Override + public void transform(String xmlName, String xslName, String resultName) + throws Exception { + preventFootShooting(); + + // Read/build xsl from a URL + Transformer transformer = factory.newTransformer( + new StreamSource(filenameToURL(xslName))); + + // Set any of our options as Attributes on the transformer + TraxWrapperUtils.setAttributes(transformer, newProcessorOpts); + + // Apply any parameters needed + applyParameters(transformer); + + // Read/build xml, transform, and write results + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + + // This is to test transformer re-use + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + } + + /** + * 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 + * + * @throws Exception any underlying exceptions from the wrapped 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) + */ + @Override + public void transformWithStylesheet(String xmlName, String resultName) + throws Exception { + if (!isStylesheetReady()) { + throw new IllegalStateException("transformWithStylesheet() when isStylesheetReady() == false"); + } + + preventFootShooting(); + + // Get Transformer from Templates + Transformer transformer = builtTemplates.newTransformer(); + + // Set any of our options as Attributes on the transformer + TraxWrapperUtils.setAttributes(transformer, newProcessorOpts); + + // Apply any parameters needed + applyParameters(transformer); + + // read/build xml, transform, and write results + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + + // This is to test transformer re-use + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + } + + /** + * 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 wrapped 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 + * + * @throws Exception any underlying exceptions from the wrapped processor + * are simply allowed to propagate; throws a RuntimeException if any other + * problems prevent us from actually completing the operation + */ + @Override + public void transformEmbedded(String xmlName, String resultName) + throws Exception { + preventFootShooting(); + // Read xsl from the xml document + Source xslSource = factory.getAssociatedStylesheet(new StreamSource(filenameToURL(xmlName)), + null, null, null); + + // Build xsl from a URL + Transformer transformer = factory.newTransformer(xslSource); + + // Set any of our options as Attributes on the transformer + TraxWrapperUtils.setAttributes(transformer, newProcessorOpts); + + // Apply any parameters needed + applyParameters(transformer); + + // read/build xml, transform, and write results + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + + // This is to test transformer re-use + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + + transformer.transform(new StreamSource(filenameToURL(xmlName)), + new StreamResult(resultName)); + } +}