Don't hold the lock while executing the listeners

git-svn-id: https://svn.apache.org/repos/asf/james/jspf/trunk@1206214 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java b/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
index 2e9a19f..18bdcbb 100644
--- a/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
+++ b/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
@@ -20,6 +20,7 @@
 package org.apache.james.jspf.executor;

 

 import java.util.ArrayList;

+import java.util.Iterator;

 import java.util.List;

 

 import org.apache.james.jspf.core.Logger;

@@ -53,29 +54,35 @@
      * @param session 

      * 

      */

-    public synchronized void setSPFResult(SPFSession session) {

-        if (!isReady) {

-            setSPFSession(session);

-            isReady = true;

-            if (waiters > 0) {

-                notifyAll();

+    public void setSPFResult(SPFSession session) {

+        Iterator<IFutureSPFResultListener> listenerIt = null;

+        synchronized (this) {

+            if (!isReady) {

+                setSPFSession(session);

+                isReady = true;

+                if (waiters > 0) {

+                    notifyAll();

+                }

+                if (listeners != null) {

+                    listenerIt = listeners.iterator();

+                    listeners = null;

+                }

             }

-            if (listeners != null) {

-                for (IFutureSPFResultListener listener : listeners) {

-                    try {

-                        listener.onSPFResult(this);

-                    } catch (Throwable e) {

-                    	// catch exception. See JSPF-95

-                        if (log != null) {

-                            log.warn("An exception was thrown by the listener " + listener, e);

-                        }

+        }

+        if (listenerIt != null) {

+            while (listenerIt.hasNext()) {

+                IFutureSPFResultListener listener = listenerIt.next();

+                try {

+                    listener.onSPFResult(this);

+                } catch (Throwable e) {

+                    // catch exception. See JSPF-95

+                    if (log != null) {

+                        log.warn("An exception was thrown by the listener " + listener, e);

                     }

                 }

             }

-            listeners = null;

+            listenerIt = null;

         }

-        

-

     }

 

     /**

@@ -166,7 +173,7 @@
      * @param listener

      */

     public synchronized void removeListener(IFutureSPFResultListener listener) {

-        if (listeners != null) {

+        if (!isReady && listeners != null) {

             listeners.remove(listener);

         }

     }