diff --git a/src/main/org/apache/tools/ant/XmlLogger.java b/src/main/org/apache/tools/ant/XmlLogger.java index 4620a85f7..06696f580 100644 --- a/src/main/org/apache/tools/ant/XmlLogger.java +++ b/src/main/org/apache/tools/ant/XmlLogger.java @@ -55,6 +55,7 @@ package org.apache.tools.ant; import java.io.*; +import java.util.*; import javax.xml.parsers.*; import org.w3c.dom.*; @@ -97,6 +98,11 @@ public class XmlLogger implements BuildListener { private long targetStartTime; private long taskStartTime; + private Stack targetTimeStack = new Stack(); + private Stack targetStack = new Stack(); + private Stack taskTimeStack = new Stack(); + private Stack taskStack = new Stack(); + /** * Constructs a new BuildListener that logs build events to an XML file. */ @@ -119,19 +125,30 @@ public class XmlLogger implements BuildListener { } try { - Writer out = new FileWriter("log.xml"); - out.write("\n\n"); - write(buildElement, out, 0); - out.flush(); - out.close(); + String outFilename = + event.getProject().getProperty("XmlLogger.file"); - } - catch(IOException exc) { + if (outFilename == null) { + outFilename = "log.xml"; + } + + Writer out = new FileWriter(outFilename); + out.write("\n\n"); + write(buildElement, out, 0); + out.flush(); + out.close(); + + } catch(IOException exc) { throw new BuildException("Unable to close log file", exc); } + buildElement = null; } public void targetStarted(BuildEvent event) { + if (targetElement != null) { + targetTimeStack.push(new Long(targetStartTime)); + targetStack.push(targetElement); + } targetStartTime = System.currentTimeMillis(); targetElement = doc.createElement(TARGET_TAG); targetElement.setAttribute(NAME_ATTR, event.getTarget().getName()); @@ -140,12 +157,26 @@ public class XmlLogger implements BuildListener { public void targetFinished(BuildEvent event) { long totalTime = System.currentTimeMillis() - targetStartTime; targetElement.setAttribute(TIME_ATTR, formatTime(totalTime)); - buildElement.appendChild(targetElement); + if (taskElement == null) { + buildElement.appendChild(targetElement); + } else { + taskElement.appendChild(targetElement); + } targetElement = null; + + if (!targetStack.isEmpty()) { + targetStartTime = ((Long) targetTimeStack.pop()).longValue(); + targetElement = (Element) targetStack.pop(); + } } public void taskStarted(BuildEvent event) { + if (taskElement != null) { + taskTimeStack.push(new Long(taskStartTime)); + taskStack.push(taskElement); + } + taskStartTime = System.currentTimeMillis(); taskElement = doc.createElement(TASK_TAG); @@ -165,6 +196,10 @@ public class XmlLogger implements BuildListener { targetElement.appendChild(taskElement); taskElement = null; + if (!taskStack.isEmpty()) { + taskStartTime = ((Long) taskTimeStack.pop()).longValue(); + taskElement = (Element) taskStack.pop(); + } } public void messageLogged(BuildEvent event) { @@ -266,4 +301,4 @@ public class XmlLogger implements BuildListener { } } -} \ No newline at end of file +}