Maybe a bit late, but what was the reason to use a ThreadLocal here?
This gives issues when the configuration of Ivy (for instance setting a custom 
logger) is done from a different thread than the actual resolve.

Maarten



________________________________
 Van: "cdu...@apache.org" <cdu...@apache.org>
Aan: notificati...@ant.apache.org 
Verzonden: vrijdag 27 december 18:40 2013
Onderwerp: svn commit: r1553704 - 
/ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java
 

Author: cduffy
Date: Fri Dec 27 17:40:20 2013
New Revision: 1553704

URL: http://svn.apache.org/r1553704
Log:
Move non-root MessageLogger instances into a thread-local stack

Logger context is inherently thread-local.

Modified:
    ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java

Modified: 
ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java?rev=1553704&r1=1553703&r2=1553704&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java 
(original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/MessageLoggerEngine.java 
Fri Dec 27 17:40:20 2013
@@ -34,7 +34,7 @@ import java.util.Stack;
  * </p>
  */
public class MessageLoggerEngine implements MessageLogger {
-    private final Stack/*<MessageLogger>*/ loggerStack = new Stack();
+    private final ThreadLocal/*<Stack<MessageLogger>>*/ loggerStacks = new 
ThreadLocal();
    
     private MessageLogger defaultLogger = null;

@@ -44,6 +44,15 @@ public class MessageLoggerEngine impleme

     private List errors = new ArrayList();
    
+    private Stack getLoggerStack() {
+        Stack stack = (Stack) loggerStacks.get();
+        if (stack == null) {
+            stack = new Stack();
+            loggerStacks.set(stack);
+        }
+        return stack;
+    }
+    
     public MessageLoggerEngine() {
     }

@@ -66,7 +75,7 @@ public class MessageLoggerEngine impleme
      */
     public void pushLogger(MessageLogger logger) {
         Checks.checkNotNull(logger, "logger");
-        loggerStack.push(logger);
+        getLoggerStack().push(logger);
     }
    
     /**
@@ -76,8 +85,8 @@ public class MessageLoggerEngine impleme
      * </p>
      */
     public void popLogger() {
-        if (!loggerStack.isEmpty()) {
-            loggerStack.pop();
+        if (!getLoggerStack().isEmpty()) {
+            getLoggerStack().pop();
         }
     }

@@ -86,10 +95,10 @@ public class MessageLoggerEngine impleme
      * @return the current logger, or the default one if there is no logger in 
the stack
      */
     public MessageLogger peekLogger() {
-        if (loggerStack.isEmpty()) {
+        if (getLoggerStack().isEmpty()) {
             return getDefaultLogger();
         }
-        return (MessageLogger) loggerStack.peek();
+        return (MessageLogger) getLoggerStack().peek();
     }

     private MessageLogger getDefaultLogger() {
@@ -130,7 +139,7 @@ public class MessageLoggerEngine impleme
    
     public void clearProblems() {
         getDefaultLogger().clearProblems();
-        for (Iterator iter = loggerStack.iterator(); iter.hasNext();) {
+        for (Iterator iter = getLoggerStack().iterator(); iter.hasNext();) {
             MessageLogger l = (MessageLogger) iter.next();
             l.clearProblems();
         }
@@ -142,7 +151,7 @@ public class MessageLoggerEngine impleme
     public void setShowProgress(boolean progress) {
         getDefaultLogger().setShowProgress(progress);
         // updates all loggers in the stack
-        for (Iterator iter = loggerStack.iterator(); iter.hasNext();) {
+        for (Iterator iter = getLoggerStack().iterator(); iter.hasNext();) {
             MessageLogger l = (MessageLogger) iter.next();
             l.setShowProgress(progress);
         }

Reply via email to