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: [email protected]
For additional commands, e-mail: [email protected]