diff --git a/build.xml b/build.xml index 2bcf82e24..cfd7f3b56 100644 --- a/build.xml +++ b/build.xml @@ -278,8 +278,14 @@ + unless="xalan2.present" /> + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java index 9a1970d7f..02482eb5f 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java @@ -63,31 +63,14 @@ import java.io.InputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.FileNotFoundException; -import java.io.OutputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.lang.reflect.Field; import java.net.URL; -import org.apache.xalan.xslt.XSLTProcessorFactory; -import org.apache.xalan.xslt.XSLTProcessor; -import org.apache.xalan.xslt.XSLTInputSource; -import org.apache.xalan.xslt.XSLTResultTarget; - import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.Source; -import javax.xml.transform.Result; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamSource; -import javax.xml.transform.stream.StreamResult; - import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -242,108 +225,3 @@ public class AggregateTransformer { } } - -/** - * Command class that encapsulate specific behavior for each - * Xalan version. The right executor will be instantiated at - * runtime via class lookup. For instance, it will check first - * for Xalan2, then for Xalan1. - */ -abstract class XalanExecutor { - /** the transformer caller */ - protected AggregateTransformer caller; - - /** set the caller for this object. */ - private final void setCaller(AggregateTransformer caller){ - this.caller = caller; - } - - /** get the appropriate stream based on the format (frames/noframes) */ - protected OutputStream getOutputStream() throws IOException { - if (caller.FRAMES.equals(caller.format)){ - // dummy output for the framed report - // it's all done by extension... - return new ByteArrayOutputStream(); - } else { - return new FileOutputStream(new File(caller.toDir, "junit-noframes.html")); - } - } - - /** override to perform transformation */ - abstract void execute() throws Exception; - - /** - * Create a valid Xalan executor. It checks first if Xalan2 is - * present, if not it checks for xalan1. If none is available, it - * fails. - * @param caller object containing the transformation information. - * @throws BuildException thrown if it could not find a valid xalan - * executor. - */ - static XalanExecutor newInstance(AggregateTransformer caller) throws BuildException { - Class procVersion = null; - XalanExecutor executor = null; - try { - procVersion = Class.forName("org.apache.xalan.processor.XSLProcessorVersion"); - executor = new Xalan2Executor(); - } catch (Exception xalan2missing){ - try { - procVersion = Class.forName("org.apache.xalan.xslt.XSLProcessorVersion"); - executor = new Xalan1Executor(); - } catch (Exception xalan1missing){ - throw new BuildException("Could not find xalan2 nor xalan1 in the classpath. Check http://xml.apache.org/xalan-j"); - } - } - String version = getXalanVersion(procVersion); - caller.task.log("Using Xalan version: " + version); - executor.setCaller(caller); - return executor; - } - - /** pretty useful data (Xalan version information) to display. */ - private static String getXalanVersion(Class procVersion) { - try { - Field f = procVersion.getField("S_VERSION"); - return f.get(null).toString(); - } catch (Exception e){ - return "?"; - } - } -} - -/** - * Xalan executor via JAXP. Nothing special must exists in the classpath - * besides of course, a parser, jaxp and xalan. - */ -class Xalan2Executor extends XalanExecutor { - void execute() throws Exception { - TransformerFactory tfactory = TransformerFactory.newInstance(); - String system_id = caller.getStylesheetSystemId(); - Source xsl_src = new StreamSource(system_id); - Transformer tformer = tfactory.newTransformer(xsl_src); - Source xml_src = new DOMSource(caller.document); - OutputStream os = getOutputStream(); - tformer.setParameter("output.dir", caller.toDir.getAbsolutePath()); - Result result = new StreamResult(os); - tformer.transform(xml_src, result); - } -} - -/** - * Xalan 1 executor. It will need a lot of things in the classpath: - * xerces for the serialization, xalan and bsf for the extension. - * @todo do everything via reflection to avoid compile problems ? - */ -class Xalan1Executor extends XalanExecutor { - void execute() throws Exception { - XSLTProcessor processor = XSLTProcessorFactory.getProcessor(); - // need to quote otherwise it breaks because of "extra illegal tokens" - processor.setStylesheetParam("output.dir", "'" + caller.toDir.getAbsolutePath() + "'"); - XSLTInputSource xml_src = new XSLTInputSource(caller.document); - String system_id = caller.getStylesheetSystemId(); - XSLTInputSource xsl_src = new XSLTInputSource(system_id); - OutputStream os = getOutputStream(); - XSLTResultTarget target = new XSLTResultTarget(os); - processor.process( xml_src, xsl_src, target); - } -} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan1Executor.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan1Executor.java new file mode 100644 index 000000000..77f8f07cf --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan1Executor.java @@ -0,0 +1,80 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.junit; + +import java.io.OutputStream; + +import org.apache.xalan.xslt.XSLTProcessorFactory; +import org.apache.xalan.xslt.XSLTProcessor; +import org.apache.xalan.xslt.XSLTInputSource; +import org.apache.xalan.xslt.XSLTResultTarget; + +/** + * Xalan 1 executor. It will need a lot of things in the classpath: + * xerces for the serialization, xalan and bsf for the extension. + * @todo do everything via reflection to avoid compile problems ? + */ +public class Xalan1Executor extends XalanExecutor { + void execute() throws Exception { + XSLTProcessor processor = XSLTProcessorFactory.getProcessor(); + // need to quote otherwise it breaks because of "extra illegal tokens" + processor.setStylesheetParam("output.dir", "'" + caller.toDir.getAbsolutePath() + "'"); + XSLTInputSource xml_src = new XSLTInputSource(caller.document); + String system_id = caller.getStylesheetSystemId(); + XSLTInputSource xsl_src = new XSLTInputSource(system_id); + OutputStream os = getOutputStream(); + XSLTResultTarget target = new XSLTResultTarget(os); + processor.process( xml_src, xsl_src, target); + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java new file mode 100644 index 000000000..040e46f68 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java @@ -0,0 +1,82 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.junit; + +import java.io.OutputStream; + +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.Source; +import javax.xml.transform.Result; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamSource; +import javax.xml.transform.stream.StreamResult; + +/** + * Xalan executor via JAXP. Nothing special must exists in the classpath + * besides of course, a parser, jaxp and xalan. + */ +public class Xalan2Executor extends XalanExecutor { + void execute() throws Exception { + TransformerFactory tfactory = TransformerFactory.newInstance(); + String system_id = caller.getStylesheetSystemId(); + Source xsl_src = new StreamSource(system_id); + Transformer tformer = tfactory.newTransformer(xsl_src); + Source xml_src = new DOMSource(caller.document); + OutputStream os = getOutputStream(); + tformer.setParameter("output.dir", caller.toDir.getAbsolutePath()); + Result result = new StreamResult(os); + tformer.transform(xml_src, result); + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java new file mode 100644 index 000000000..da45ba2c1 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java @@ -0,0 +1,133 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.junit; + +import org.apache.tools.ant.BuildException; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileOutputStream; + +import java.lang.reflect.Field; + +/** + * Command class that encapsulate specific behavior for each + * Xalan version. The right executor will be instantiated at + * runtime via class lookup. For instance, it will check first + * for Xalan2, then for Xalan1. + */ +abstract class XalanExecutor { + /** the transformer caller */ + protected AggregateTransformer caller; + + /** set the caller for this object. */ + private final void setCaller(AggregateTransformer caller){ + this.caller = caller; + } + + /** get the appropriate stream based on the format (frames/noframes) */ + protected OutputStream getOutputStream() throws IOException { + if (caller.FRAMES.equals(caller.format)){ + // dummy output for the framed report + // it's all done by extension... + return new ByteArrayOutputStream(); + } else { + return new FileOutputStream(new File(caller.toDir, "junit-noframes.html")); + } + } + + /** override to perform transformation */ + abstract void execute() throws Exception; + + /** + * Create a valid Xalan executor. It checks first if Xalan2 is + * present, if not it checks for xalan1. If none is available, it + * fails. + * @param caller object containing the transformation information. + * @throws BuildException thrown if it could not find a valid xalan + * executor. + */ + static XalanExecutor newInstance(AggregateTransformer caller) throws BuildException { + Class procVersion = null; + XalanExecutor executor = null; + try { + procVersion = Class.forName("org.apache.xalan.processor.XSLProcessorVersion"); + executor = new Xalan2Executor(); + } catch (Exception xalan2missing){ + try { + procVersion = Class.forName("org.apache.xalan.xslt.XSLProcessorVersion"); + executor = (XalanExecutor) Class.forName( + "org.apache.tools.ant.taskdefs.optional.junit.Xalan1Executor()").newInstance(); + } catch (Exception xalan1missing){ + throw new BuildException("Could not find xalan2 nor xalan1 in the classpath. Check http://xml.apache.org/xalan-j"); + } + } + String version = getXalanVersion(procVersion); + caller.task.log("Using Xalan version: " + version); + executor.setCaller(caller); + return executor; + } + + /** pretty useful data (Xalan version information) to display. */ + private static String getXalanVersion(Class procVersion) { + try { + Field f = procVersion.getField("S_VERSION"); + return f.get(null).toString(); + } catch (Exception e){ + return "?"; + } + } +}