Author: norman
Date: Wed Nov 16 15:47:08 2011
New Revision: 1202747

URL: http://svn.apache.org/viewvc?rev=1202747&view=rev
Log:
Add support for IFutureSPFResultListener. See JSPF-94

Modified:
    
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java

Modified: 
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
URL: 
http://svn.apache.org/viewvc/james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java?rev=1202747&r1=1202746&r2=1202747&view=diff
==============================================================================
--- 
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
 (original)
+++ 
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/executor/FutureSPFResult.java
 Wed Nov 16 15:47:08 2011
@@ -19,6 +19,9 @@
 
 package org.apache.james.jspf.executor;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.james.jspf.core.SPFSession;
 
 
@@ -29,6 +32,8 @@ import org.apache.james.jspf.core.SPFSes
 public class FutureSPFResult extends SPFResult {
     
     private boolean isReady;
+    private List<IFutureSPFResultListener> listeners;
+    private int waiters;
     
     public FutureSPFResult() {
         isReady = false;
@@ -41,9 +46,21 @@ public class FutureSPFResult extends SPF
      * 
      */
     public synchronized void setSPFResult(SPFSession session) {
-        setSPFSession(session);
-        isReady = true;
-        notify();
+        if (!isReady) {
+            setSPFSession(session);
+            isReady = true;
+            if (waiters > 0) {
+                notifyAll();
+            }
+            if (listeners != null) {
+                for (IFutureSPFResultListener listener : listeners) {
+                    listener.onSPFResult(this);
+                }
+            }
+            listeners = null;
+        }
+        
+
     }
 
     /**
@@ -53,9 +70,13 @@ public class FutureSPFResult extends SPF
     private synchronized void checkReady() {
         while (!isReady) {
             try {
+                waiters++;
                 wait();
             } catch (InterruptedException e) {
-                //
+                // 
+                Thread.interrupted();
+            } finally {
+                waiters--;
             }
         }
     }
@@ -108,4 +129,47 @@ public class FutureSPFResult extends SPF
     public synchronized boolean isReady() {
         return isReady;
     }
+
+    /**
+     * Add a {@link IFutureSPFResultListener} which will get notified once 
{@link #isReady()} returns <code>true</code>
+     * 
+     * @param listener
+     */
+    public synchronized void addListener(IFutureSPFResultListener listener) {
+        if (!isReady) {
+            if (listeners == null) {
+                listeners = new ArrayList<IFutureSPFResultListener>();
+            }
+            listeners.add(listener);
+        } else {
+            listener.onSPFResult(this);
+        }
+    }
+   
+    /**
+     * Remove a {@link IFutureSPFResultListener}
+     * 
+     * @param listener
+     */
+    public synchronized void removeListener(IFutureSPFResultListener listener) 
{
+        if (listeners != null) {
+            listeners.remove(listener);
+        }
+    }
+    
+    
+    /**
+     * Listener which will get notified once a {@link 
FutureSPFResult#isReady()} returns <code>true</code>. So it will not block 
anymore
+     * 
+     *
+     */
+    public interface IFutureSPFResultListener {
+        
+        /**
+         * Get called once a {@link FutureSPFResult} is ready
+         * 
+         * @param result
+         */
+        void onSPFResult(FutureSPFResult result);
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to