Author: norman
Date: Fri Sep 16 17:32:34 2011
New Revision: 1171686

URL: http://svn.apache.org/viewvc?rev=1171686&view=rev
Log:
Directly remove MailboxListener's on ImapSession.logout(). This is related to 
changes of MAILBOX-134

Modified:
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/ImapStateAwareMailboxListener.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/IdleProcessor.java?rev=1171686&r1=1171685&r2=1171686&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
 Fri Sep 16 17:32:34 2011
@@ -28,7 +28,6 @@ import java.util.Locale;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionState;
@@ -42,8 +41,8 @@ import org.apache.james.imap.api.process
 import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.message.request.IdleRequest;
 import org.apache.james.imap.message.response.ContinuationResponse;
-import org.apache.james.imap.processor.base.ImapStateAwareMailboxListener;
 import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 
@@ -73,7 +72,6 @@ public class IdleProcessor extends Abstr
     }
 
     protected void doProcess(final IdleRequest message, final ImapSession 
session, final String tag, final ImapCommand command, final Responder 
responder) {
-        final AtomicBoolean closed = new AtomicBoolean(false);
 
         try {
             responder.respond(new 
ContinuationResponse(HumanReadableText.IDLING));
@@ -81,9 +79,13 @@ public class IdleProcessor extends Abstr
 
             final MailboxManager mailboxManager = getMailboxManager();
             final MailboxSession mailboxSession = 
ImapSessionUtils.getMailboxSession(session);
-            SelectedMailbox sm = session.getSelected();
+            final SelectedMailbox sm = session.getSelected();
+            final MailboxListener idleListener;
             if (sm != null) {
-                mailboxManager.addListener(sm.getPath(), new 
IdleMailboxListener(closed, session, responder), mailboxSession);
+                idleListener = new IdleMailboxListener(session, responder);
+                mailboxManager.addListener(sm.getPath(), idleListener , 
mailboxSession);
+            } else {
+                idleListener = null;
             }
 
             session.pushLineHandler(new ImapLineHandler() {
@@ -103,7 +105,13 @@ public class IdleProcessor extends Abstr
                         line = "";
                     }
 
-                    closed.set(true);
+                    if (idleListener != null) {
+                        try {
+                            mailboxManager.removeListener(sm.getPath(), 
idleListener, mailboxSession);
+                        } catch (MailboxException e) {
+                            session.getLog().info("Unable to remove idle 
listener from mailbox", e);
+                        }
+                    }
                     session.popLineHandler();
                     if (!DONE.equals(line.toUpperCase(Locale.US))) {
                         StatusResponse response = 
getStatusResponseFactory().taggedBad(tag, command, 
HumanReadableText.INVALID_COMMAND);
@@ -122,7 +130,7 @@ public class IdleProcessor extends Abstr
                     public void run() {
                         // check if we need to cancel the Runnable
                         // See IMAP-275
-                        if (session.getState() != ImapSessionState.LOGOUT && 
closed.get() == false) {
+                        if (session.getState() != ImapSessionState.LOGOUT) {
                             // Send a heartbeat to the client to make sure we
                             // reset the idle timeout. This is kind of the same
                             // workaround as dovecot use.
@@ -142,7 +150,6 @@ public class IdleProcessor extends Abstr
             }
 
         } catch (MailboxException e) {
-            closed.set(true);
             session.getLog().debug("Idle failed", e);
             // TODO: What should we do here?
             no(command, tag, responder, 
HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
@@ -157,37 +164,20 @@ public class IdleProcessor extends Abstr
         return CAPS;
     }
 
-    private class IdleMailboxListener extends ImapStateAwareMailboxListener {
+    private class IdleMailboxListener implements MailboxListener {
 
-        private final AtomicBoolean closed;
         private final Responder responder;
+        private final ImapSession session;
 
-        public IdleMailboxListener(AtomicBoolean closed, ImapSession session, 
Responder responder) {
-            super(session);
-            this.closed = closed;
+        public IdleMailboxListener(ImapSession session, Responder responder) {
+            this.session = session;
             this.responder = responder;
         }
 
         public void event(Event event) {
-            synchronized (session) {
-                if (isClosed()) {
-                    return;
-                }
-                if (event instanceof Added || event instanceof Expunged || 
event instanceof FlagsUpdated) {
-                    unsolicitedResponses(session, responder, false);
-                }
+            if (event instanceof Added || event instanceof Expunged || event 
instanceof FlagsUpdated) {
+                unsolicitedResponses(session, responder, false);
             }
         }
-
-        /*
-         * (non-Javadoc)
-         * 
-         * @see 
org.apache.james.imap.processor.ImapSessionAwareMailboxListener#
-         * isListenerClosed()
-         */
-        protected boolean isListenerClosed() {
-            return closed.get();
-        }
-
     }
 }

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java?rev=1171686&r1=1171685&r2=1171686&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MailboxEventAnalyser.java
 Fri Sep 16 17:32:34 2011
@@ -41,7 +41,7 @@ import org.apache.james.mailbox.UpdatedF
  * notifications and analyze these. It will only act on {@link Event}
  * notifications which are sent for the registered MailboxPath
  */
-public class MailboxEventAnalyser extends ImapStateAwareMailboxListener {
+public class MailboxEventAnalyser implements MailboxListener {
 
     private final long sessionId;
     private Set<Long> flagUpdateUids;
@@ -55,9 +55,10 @@ public class MailboxEventAnalyser extend
     private boolean closed = false;
     private Flags applicableFlags;
     private boolean applicableFlagsChanged;
+    private ImapSession session;
 
     public MailboxEventAnalyser(final ImapSession session, final MailboxPath 
mailboxPath, Flags applicableFlags) {
-        super(session);
+        this.session = session;
         this.sessionId = 
ImapSessionUtils.getMailboxSession(session).getSessionId();
         flagUpdateUids = new TreeSet<Long>();
         expungedUids = new TreeSet<Long>();
@@ -287,17 +288,6 @@ public class MailboxEventAnalyser extend
         expungedUids.clear();
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.imap.processor.base.ImapStateAwareMailboxListener#
-     * isListenerClosed()
-     */
-    protected synchronized boolean isListenerClosed() {
-        return closed;
-    }
-    
-
 
     public synchronized Flags getApplicableFlags() {
         return applicableFlags;

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java?rev=1171686&r1=1171685&r2=1171686&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
 Fri Sep 16 17:32:34 2011
@@ -47,6 +47,12 @@ public class SelectedMailboxImpl impleme
     private final Set<Long> recentUids;
 
     private boolean recentUidRemoved;
+
+    private MailboxManager mailboxManager;
+
+    private MailboxPath path;
+
+    private ImapSession session;
     
     public SelectedMailboxImpl(final MailboxManager mailboxManager, final 
Iterator<Long> uids, final Flags applicableFlags, final ImapSession session, 
final MailboxPath path) throws MailboxException {
         recentUids = new TreeSet<Long>();
@@ -58,6 +64,9 @@ public class SelectedMailboxImpl impleme
         mailboxManager.addListener(path, events, mailboxSession);
         converter = new UidToMsnConverter(session, uids);
         mailboxManager.addListener(path, converter, mailboxSession);
+        this.mailboxManager = mailboxManager;
+        this.path = path;
+        this.session = session;
     }
 
     /**
@@ -67,6 +76,20 @@ public class SelectedMailboxImpl impleme
         converter.close();
         events.close();
         recentUids.clear();
+        MailboxSession mailboxSession = 
ImapSessionUtils.getMailboxSession(session);
+
+        try {
+            mailboxManager.removeListener(path, converter, mailboxSession);
+        } catch (MailboxException e) {
+            session.getLog().info("Unable to remove listener " + converter + " 
from mailbox while closing it", e);
+        }
+        try {
+            mailboxManager.removeListener(path, events, mailboxSession);
+        } catch (MailboxException e) {
+            session.getLog().info("Unable to remove listener " + events + " 
from mailbox while closing it", e);
+
+        }
+
     }
 
     /*

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java?rev=1171686&r1=1171685&r2=1171686&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
 Fri Sep 16 17:32:34 2011
@@ -36,7 +36,7 @@ import org.apache.james.mailbox.MailboxL
  * TODO: This is a major memory hog TODO: Each concurrent session requires one,
  * and typical clients now open many
  */
-public class UidToMsnConverter extends ImapStateAwareMailboxListener {
+public class UidToMsnConverter implements MailboxListener {
     private SortedMap<Integer, Long> msnToUid;
 
     private SortedMap<Long, Integer> uidToMsn;
@@ -45,10 +45,8 @@ public class UidToMsnConverter extends I
 
     private int highestMsn = 0;
 
-    private boolean closed = false;
 
     public UidToMsnConverter(final ImapSession session, final Iterator<Long> 
uids) {
-        super(session);
         msnToUid = new TreeMap<Integer, Long>();
         uidToMsn = new TreeMap<Long, Integer>();
         if (uids != null) {
@@ -177,7 +175,6 @@ public class UidToMsnConverter extends I
     public synchronized void close() {
         uidToMsn.clear();
         msnToUid.clear();
-        closed = true;
     }
 
     /**
@@ -187,13 +184,4 @@ public class UidToMsnConverter extends I
         return uidToMsn.size();
     }
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.james.imap.processor.ImapSessionAwareMailboxListener#
-     * isListenerClosed()
-     */
-    protected synchronized boolean isListenerClosed() {
-        return closed;
-    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to