From 15624f5e8f83560ad42f32095345af33803beaa7 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Sun, 25 Nov 2001 19:28:51 +0000 Subject: [PATCH] Allow junitreport to be compiled independent of the presence of Xalan1. The reason for this is that the Xalan1 team is strongly considering removing Xalan1Compat from cvs... No logic changes were made in this commit...classes were merely split out into separate files, and the instance of Xalan1Executor is now created using reflection APIs. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270007 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 8 +- .../optional/junit/AggregateTransformer.java | 122 ---------------- .../optional/junit/Xalan1Executor.java | 80 +++++++++++ .../optional/junit/Xalan2Executor.java | 82 +++++++++++ .../optional/junit/XalanExecutor.java | 133 ++++++++++++++++++ 5 files changed, 302 insertions(+), 123 deletions(-) create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan1Executor.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java 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 "?"; + } + } +}