From f110a5fb7a1553b1a15ab5c2da02235e48101426 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 11 Jul 2008 15:45:53 +0000 Subject: [PATCH] XmlLogger could lose messages when parallel is used. PR 25734. Based on analysis and patch by Craig Sandvik git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@675993 13f79535-47bb-0310-9956-ffa450edef68 --- CONTRIBUTORS | 1 + WHATSNEW | 3 +++ contributors.xml | 4 ++++ src/main/org/apache/tools/ant/XmlLogger.java | 24 +++++++++++++------- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index fee2a9338..328895b44 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -44,6 +44,7 @@ Craeg Strong Craig Cottingham Craig R. McClanahan Craig Ryan +Craig Sandvik Curtis White Cyrille Morvan D'Arcy Smith diff --git a/WHATSNEW b/WHATSNEW index f401f60aa..350789623 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -101,6 +101,9 @@ Fixed bugs: parts, some result sets wouldn't get printed. Bugzilla Report 32168. + * XmlLogger could lose messages if is used. + Bugzilla Report 25734. + Other changes: -------------- diff --git a/contributors.xml b/contributors.xml index 9e37b16c2..cee92e86c 100644 --- a/contributors.xml +++ b/contributors.xml @@ -199,6 +199,10 @@ Craig Ryan + + Craig + Sandvik + Curtis White diff --git a/src/main/org/apache/tools/ant/XmlLogger.java b/src/main/org/apache/tools/ant/XmlLogger.java index d5ba6b395..b2a86c584 100644 --- a/src/main/org/apache/tools/ant/XmlLogger.java +++ b/src/main/org/apache/tools/ant/XmlLogger.java @@ -33,6 +33,7 @@ import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.StringUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.w3c.dom.Text; /** @@ -172,7 +173,7 @@ public class XmlLogger implements BuildLogger { Text errText = doc.createCDATASection(StringUtils.getStackTrace(t)); Element stacktrace = doc.createElement(STACKTRACE_TAG); stacktrace.appendChild(errText); - buildElement.element.appendChild(stacktrace); + synchronizedAppend(buildElement.element, stacktrace); } String outFilename = event.getProject().getProperty("XmlLogger.file"); if (outFilename == null) { @@ -267,9 +268,10 @@ public class XmlLogger implements BuildLogger { } } if (parentElement == null) { - buildElement.element.appendChild(targetElement.element); + synchronizedAppend(buildElement.element, targetElement.element); } else { - parentElement.element.appendChild(targetElement.element); + synchronizedAppend(parentElement.element, + targetElement.element); } } targets.remove(target); @@ -320,9 +322,9 @@ public class XmlLogger implements BuildLogger { targetElement = (TimedElement) targets.get(target); } if (targetElement == null) { - buildElement.element.appendChild(taskElement.element); + synchronizedAppend(buildElement.element, taskElement.element); } else { - targetElement.element.appendChild(taskElement.element); + synchronizedAppend(targetElement.element, taskElement.element); } Stack threadStack = getStack(); if (!threadStack.empty()) { @@ -394,7 +396,7 @@ public class XmlLogger implements BuildLogger { Text errText = doc.createCDATASection(StringUtils.getStackTrace(ex)); Element stacktrace = doc.createElement(STACKTRACE_TAG); stacktrace.appendChild(errText); - buildElement.element.appendChild(stacktrace); + synchronizedAppend(buildElement.element, stacktrace); } Text messageText = doc.createCDATASection(event.getMessage()); messageElement.appendChild(messageText); @@ -411,9 +413,9 @@ public class XmlLogger implements BuildLogger { parentElement = (TimedElement) targets.get(target); } if (parentElement != null) { - parentElement.element.appendChild(messageElement); + synchronizedAppend(parentElement.element, messageElement); } else { - buildElement.element.appendChild(messageElement); + synchronizedAppend(buildElement.element, messageElement); } } @@ -459,4 +461,10 @@ public class XmlLogger implements BuildLogger { public void setErrorPrintStream(PrintStream err) { } + private void synchronizedAppend(Node parent, Node child) { + synchronized(parent) { + parent.appendChild(child); + } + } + }