Package org.apache.tools.ant.taskdefs.optional.junit

# Class XMLResultAggregator

java.lang.Object
org.apache.tools.ant.ProjectComponent
org.apache.tools.ant.Task
org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator

All Implemented Interfaces:
  `Cloneable`, `XMLConstants`

public class XMLResultAggregator extends Task implements XMLConstants
Aggregates all <junit> XML formatter testsuite data under a specific directory and transforms the results via XSLT. It is not particularly clean but should be helpful while I am thinking about another technique.

The main problem is due to the fact that a JVM can be forked for a testcase thus making it impossible to aggregate all testcases since the listener is (obviously) in the forked JVM. A solution could be to write a TestListener that will receive events from the TestRunner via sockets. This is IMHO the simplest way to do it to avoid this file hacking thing.

## Field Summary

Fields
Modifier and Type
Field
Description
`static final String`
`DEFAULT_DIR`
The default directory: `.`.
`static final String`
`DEFAULT_FILENAME`
the default file name: `TESTS-TestSuites.xml`
`protected Vector<FileSet>`
`filesets`
the list of all filesets, that should contains the xml to aggregate
`protected int`
`generatedId`
the current generated id
`protected File`
`toDir`
the directory to write the file to
`protected String`
`toFile`
the name of the result file
`protected Vector<AggregateTransformer>`
`transformers`

### Fields inherited from class org.apache.tools.ant.Task

`target, taskName, taskType, wrapper`

### Fields inherited from class org.apache.tools.ant.ProjectComponent

`description, location, project`

### Fields inherited from interface org.apache.tools.ant.taskdefs.optional.junit.XMLConstants

`ATTR_CLASSNAME, ATTR_ERRORS, ATTR_FAILURES, ATTR_ID, ATTR_MESSAGE, ATTR_NAME, ATTR_PACKAGE, ATTR_SKIPPED, ATTR_TESTS, ATTR_TIME, ATTR_TYPE, ATTR_VALUE, ERROR, FAILURE, HOSTNAME, PROPERTIES, PROPERTY, SYSTEM_ERR, SYSTEM_OUT, TESTCASE, TESTSUITE, TESTSUITES, TIMESTAMP`

## Constructor Summary

Constructors
Constructor
Description
`XMLResultAggregator()`

## Method Summary

Modifier and Type
Method
Description
`void`
`addFileSet(FileSet fs)`
Add a new fileset containing the XML results to aggregate
`protected void`
`addTestSuite(Element root, Element testsuite)`
Add a new testsuite node to the document.
`protected Element`
`createDocument()`
Create a DOM tree.
`AggregateTransformer`
`createReport()`
Generate a report based on the document created by the merge.
`void`
`execute()`
Aggregate all testsuites into a single document and write it to the specified directory and file.
`File`
`getDestinationFile()`
Get the full destination file where to write the result.
`protected File[]`
`getFiles()`
Get all `.xml` files in the fileset.
`void`
`setTodir(File value)`
Set the destination directory where the results should be written.
`void`
`setTofile(String value)`
Set the name of the aggregated results file.
`protected void`
`writeDOMTree(Document doc, File file)`
Write the DOM tree to a file.

### Methods inherited from class org.apache.tools.ant.Task

`bindToOwner, getOwningTarget, getRuntimeConfigurableWrapper, getTaskName, getTaskType, getWrapper, handleErrorFlush, handleErrorOutput, handleFlush, handleInput, handleOutput, init, isInvalid, log, log, log, log, maybeConfigure, perform, reconfigure, setOwningTarget, setRuntimeConfigurableWrapper, setTaskName, setTaskType`

### Methods inherited from class org.apache.tools.ant.ProjectComponent

`clone, getDescription, getLocation, getProject, setDescription, setLocation, setProject`

### Methods inherited from class java.lang.Object

`equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### filesets

protected Vector<FileSet> filesets
the list of all filesets, that should contains the xml to aggregate

### toFile

protected String toFile
the name of the result file

### toDir

protected File toDir
the directory to write the file to

### transformers

protected Vector<AggregateTransformer> transformers

### DEFAULT_DIR

public static final String DEFAULT_DIR
The default directory: `.`. It is resolved from the project directory

See Also:
  - Constant Field Values

### DEFAULT_FILENAME

public static final String DEFAULT_FILENAME
the default file name: `TESTS-TestSuites.xml`

See Also:
  - Constant Field Values

### generatedId

protected int generatedId
the current generated id

## Constructor Details

### XMLResultAggregator

public XMLResultAggregator()

## Method Details

### createReport

public AggregateTransformer createReport()
Generate a report based on the document created by the merge.

Returns:
  the report

### setTofile

public void setTofile(String value)
Set the name of the aggregated results file. It must be relative from the `todir` attribute. If not set it will use `DEFAULT_FILENAME`

Parameters:
  `value` - the name of the file.
See Also:
  - `setTodir(File)`

### setTodir

public void setTodir(File value)
Set the destination directory where the results should be written. If not set if will use `DEFAULT_DIR`. When given a relative directory it will resolve it from the project directory.

Parameters:
  `value` - the directory where to write the results, absolute or relative.

### addFileSet

public void addFileSet(FileSet fs)
Add a new fileset containing the XML results to aggregate

Parameters:
  `fs` - the new fileset of xml results.

### execute

public void execute() throws BuildException
Aggregate all testsuites into a single document and write it to the specified directory and file.

Overrides:
  `execute` in class `Task`
Throws:
  `BuildException` - thrown if there is a serious error while writing the document.

### getDestinationFile

public File getDestinationFile()
Get the full destination file where to write the result. It is made of the `todir` and `tofile` attributes.

Returns:
  the destination file where should be written the result file.

### getFiles

protected File[] getFiles()
Get all `.xml` files in the fileset.

Returns:
  all files in the fileset that end with a '.xml'.

### writeDOMTree

protected void writeDOMTree(Document doc, File file) throws IOException
Write the DOM tree to a file.

Parameters:
  `doc` - the XML document to dump to disk.
  `file` - the filename to write the document to. Should obviously be a .xml file.
Throws:
  `IOException` - thrown if there is an error while writing the content.

### createDocument

protected Element createDocument()
Create a DOM tree. Has 'testsuites' as firstchild and aggregates all testsuite results that exists in the base directory.

Returns:
  the root element of DOM tree that aggregates all testsuites.

### addTestSuite

protected void addTestSuite(Element root, Element testsuite)

Add a new testsuite node to the document. The main difference is that it split the previous fully qualified name into a package and a name.

For example: `org.apache.Whatever` will be split into `org.apache` and `Whatever`.

Parameters:
  `root` - the root element to which the `testsuite` node should be appended.
  `testsuite` - the element to append to the given root. It will slightly modify the original node to change the name attribute and add a package one.