diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java new file mode 100644 index 00000000..ec3506d4 --- /dev/null +++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java @@ -0,0 +1,346 @@ +/* + * 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.tools.ant.taskdefs.optional.junit; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.Delete; +import org.apache.tools.ant.taskdefs.TempFile; +import org.apache.tools.ant.taskdefs.XSLTProcess; +import org.apache.tools.ant.types.EnumeratedAttribute; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.FileResource; +import org.apache.tools.ant.types.resources.URLResource; +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.JAXPUtils; +import org.w3c.dom.Document; + +/** + * Transform a JUnit xml report. + * The default transformation generates an html report in either framed or non-framed + * style. The non-framed style is convenient to have a concise report via mail, the + * framed report is much more convenient if you want to browse into different + * packages or testcases since it is a Javadoc like report. + * + */ +public class AggregateTransformer { + /** + * name of the frames format. + */ + public static final String FRAMES = "frames"; + + /** + * name of the no frames format. + */ + public static final String NOFRAMES = "noframes"; + + /** + * defines acceptable formats. + */ + public static class Format extends EnumeratedAttribute { + /** + * list authorized values. + * @return authorized values. + */ + public String[] getValues() { + return new String[]{FRAMES, NOFRAMES}; + } + } + + // CheckStyle:VisibilityModifier OFF - bc + /** Task */ + protected Task task; + + /** the xml document to process */ + protected Document document; + + /** the style directory. XSLs should be read from here if necessary */ + protected File styleDir; + + /** the destination directory, this is the root from where html should be generated */ + protected File toDir; + + /** + * The internal XSLT task used to perform the transformation. + * + * @since Ant 1.9.5 + */ + private XSLTProcess xsltTask; + + /** + * Instance of a utility class to use for file operations. + * + * @since Ant 1.7 + */ + private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); + + /** + * Used to ensure the uniqueness of a property + */ + private static int counter = 0; + + /** the format to use for the report. Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt> */ + protected String format = FRAMES; + + /** XML Parser factory */ + private static DocumentBuilderFactory privateDBFactory; + + /** XML Parser factory accessible to subclasses */ + protected static DocumentBuilderFactory dbfactory; + + static { + privateDBFactory = DocumentBuilderFactory.newInstance(); + dbfactory = privateDBFactory; + } + // CheckStyle:VisibilityModifier ON + + /** + * constructor creating the transformer from the junitreport task. + * @param task task delegating to this class + */ + public AggregateTransformer(Task task) { + this.task = task; + xsltTask = new XSLTProcess(); + xsltTask.bindToOwner(task); + } + + /** + * Get the Document Builder Factory + * + * @return the DocumentBuilderFactory instance in use + */ + protected static DocumentBuilderFactory getDocumentBuilderFactory() { + return privateDBFactory; + } + + /** + * sets the format. + * @param format Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt> + */ + public void setFormat(Format format) { + this.format = format.getValue(); + } + + /** + * sets the input document. + * @param doc input dom tree + */ + public void setXmlDocument(Document doc) { + this.document = doc; + } + + /** + * Set the xml file to be processed. This is a helper if you want + * to set the file directly. Much more for testing purposes. + * @param xmlfile xml file to be processed + * @throws BuildException if the document cannot be parsed. + */ + protected void setXmlfile(File xmlfile) throws BuildException { + try { + DocumentBuilder builder = privateDBFactory.newDocumentBuilder(); + InputStream in = new FileInputStream(xmlfile); + try { + Document doc = builder.parse(in); + setXmlDocument(doc); + } finally { + in.close(); + } + } catch (Exception e) { + throw new BuildException("Error while parsing document: " + xmlfile, e); + } + } + + /** + * set the style directory. It is optional and will override the + * default xsl used. + * @param styledir the directory containing the xsl files if the user + * would like to override with its own style. + */ + public void setStyledir(File styledir) { + this.styleDir = styledir; + } + + /** set the destination directory. + * @param todir the destination directory + */ + public void setTodir(File todir) { + this.toDir = todir; + } + + /** set the extension of the output files + * @param ext extension. + */ + public void setExtension(String ext) { + task.log("extension is not used anymore", Project.MSG_WARN); + } + + /** + * Create an instance of an XSL parameter for configuration by Ant. + * + * @return an instance of the Param class to be configured. + * @since Ant 1.7 + */ + public XSLTProcess.Param createParam() { + return xsltTask.createParam(); + } + + /** + * Creates a classpath to be used for the internal XSLT task. + * + * @return the classpath to be configured + * @since Ant 1.9.5 + */ + public Path createClasspath() { + return xsltTask.createClasspath(); + } + + /** + * Creates a factory configuration to be used for the internal XSLT task. + * + * @return the factory description to be configured + * @since Ant 1.9.5 + */ + public XSLTProcess.Factory createFactory() { + return xsltTask.createFactory(); + } + + /** + * transformation + * @throws BuildException exception if something goes wrong with the transformation. + */ + public void transform() throws BuildException { + checkOptions(); + Project project = task.getProject(); + + TempFile tempFileTask = new TempFile(); + tempFileTask.bindToOwner(task); + + xsltTask.setXslResource(getStylesheet()); + + // acrobatic cast. + xsltTask.setIn(((XMLResultAggregator) task).getDestinationFile()); + File outputFile = null; + if (format.equals(FRAMES)) { + String tempFileProperty = getClass().getName() + String.valueOf(counter++); + File tmp = FILE_UTILS.resolveFile(project.getBaseDir(), project + .getProperty("java.io.tmpdir")); + tempFileTask.setDestDir(tmp); + tempFileTask.setProperty(tempFileProperty); + tempFileTask.execute(); + outputFile = new File(project.getProperty(tempFileProperty)); + } else { + outputFile = new File(toDir, "junit-noframes.html"); + } + xsltTask.setOut(outputFile); + XSLTProcess.Param paramx = xsltTask.createParam(); + paramx.setProject(task.getProject()); + paramx.setName("output.dir"); + paramx.setExpression(toDir.getAbsolutePath()); + final long t0 = System.currentTimeMillis(); + try { + xsltTask.execute(); + } catch (Exception e) { + throw new BuildException("Errors while applying transformations: " + e.getMessage(), e); + } + final long dt = System.currentTimeMillis() - t0; + task.log("Transform time: " + dt + "ms"); + if (format.equals(FRAMES)) { + Delete delete = new Delete(); + delete.bindToOwner(task); + delete.setFile(outputFile); + delete.execute(); + } + } + + /** + * access the stylesheet to be used as a resource. + * @return stylesheet as a resource + */ + protected Resource getStylesheet() { + String xslname = "junit-frames.xsl"; + if (NOFRAMES.equals(format)) { + xslname = "junit-noframes.xsl"; + } + if (styleDir == null) { + // If style dir is not specified we have to retrieve + // the stylesheet from the classloader + URL stylesheetURL = getClass().getClassLoader().getResource( + "org/apache/tools/ant/taskdefs/optional/junit/xsl/" + xslname); + return new URLResource(stylesheetURL); + } + // If we are here, then the style dir is here and we + // should read the stylesheet from the filesystem + return new FileResource(new File(styleDir, xslname)); + } + + /** check for invalid options + * @throws BuildException if something goes wrong. + */ + protected void checkOptions() throws BuildException { + // set the destination directory relative from the project if needed. + if (toDir == null) { + toDir = task.getProject().resolveFile("."); + } else if (!toDir.isAbsolute()) { + toDir = task.getProject().resolveFile(toDir.getPath()); + } + } + + /** + * Get the systemid of the appropriate stylesheet based on its + * name and styledir. If no styledir is defined it will load + * it as a java resource in the xsl child package, otherwise it + * will get it from the given directory. + * @return system ID of the stylesheet. + * @throws IOException thrown if the requested stylesheet does + * not exist. + */ + protected String getStylesheetSystemId() throws IOException { + String xslname = "junit-frames.xsl"; + if (NOFRAMES.equals(format)) { + xslname = "junit-noframes.xsl"; + } + if (styleDir == null) { + URL url = getClass().getResource("xsl/" + xslname); + if (url == null) { + throw new FileNotFoundException("Could not find jar resource " + xslname); + } + return url.toExternalForm(); + } + File file = new File(styleDir, xslname); + if (!file.exists()) { + throw new FileNotFoundException("Could not find file '" + file + "'"); + } + return JAXPUtils.getSystemId(file); + } + +} |