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