Author: rdonkin
Date: Wed May 13 16:47:29 2009
New Revision: 774425

URL: http://svn.apache.org/viewvc?rev=774425&view=rev
Log:
Force logout when abandoned. IMAP-84 
https://issues.apache.org/jira/browse/IMAP-84

Added:
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/SystemMessage.java
   (with props)
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
   (with props)
Modified:
    
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
    
james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java

Modified: 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java?rev=774425&r1=774424&r2=774425&view=diff
==============================================================================
--- 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java
 (original)
+++ 
james/imap/trunk/mailbox/src/main/java/org/apache/james/imap/mailbox/MailboxManager.java
 Wed May 13 16:47:29 2009
@@ -182,6 +182,10 @@
      * Mailboxes that create sessions which are expensive to maintain
      * <code>MUST</code> retain a reference and periodically check {...@link 
MailboxSession#isOpen()}.
      * </p>
+     * <p>
+     * Note that implementations much be aware that it is possible that this 
method 
+     * may be called more than once with the same session.
+     * </p>
      * @param session not null
      * @param force true when the session logout is forced by premature 
connection termination
      * @throws MailboxException when logout fails

Added: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/SystemMessage.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/SystemMessage.java?rev=774425&view=auto
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/SystemMessage.java
 (added)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/SystemMessage.java
 Wed May 13 16:47:29 2009
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.message.request;
+
+import org.apache.james.imap.api.ImapMessage;
+
+/**
+ * System messages do not correspond to IMAP commands.
+ */
+public enum SystemMessage implements ImapMessage {
+
+    /** Indicate that an premature termination has forced a logout without a 
LOGOUT command */
+    FORCE_LOGOUT
+}

Propchange: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/SystemMessage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java?rev=774425&r1=774424&r2=774425&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
 Wed May 13 16:47:29 2009
@@ -38,9 +38,9 @@
             final ImapProcessor chainEndProcessor,
             final MailboxManagerProvider mailboxManagerProvider,
             final StatusResponseFactory statusResponseFactory) {
-        
+        final SystemMessageProcessor systemProcessor = new 
SystemMessageProcessor(chainEndProcessor, mailboxManagerProvider);
         final LogoutProcessor logoutProcessor = new LogoutProcessor(
-                chainEndProcessor, mailboxManagerProvider, 
statusResponseFactory);
+                systemProcessor, mailboxManagerProvider, 
statusResponseFactory);
         final List<String> capabilities = new ArrayList<String>();
         capabilities.add(VERSION);
         capabilities.add(SUPPORTS_LITERAL_PLUS);

Added: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java?rev=774425&view=auto
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
 (added)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
 Wed May 13 16:47:29 2009
@@ -0,0 +1,83 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.processor;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.mailbox.MailboxException;
+import org.apache.james.imap.mailbox.MailboxManager;
+import org.apache.james.imap.mailbox.MailboxManagerProvider;
+import org.apache.james.imap.mailbox.MailboxSession;
+import org.apache.james.imap.message.request.SystemMessage;
+import org.apache.james.imap.processor.base.AbstractChainedProcessor;
+import org.apache.james.imap.processor.base.ImapSessionUtils;
+
+/**
+ * Processes system messages unrelated to IMAP.
+ */
+public class SystemMessageProcessor extends AbstractChainedProcessor {
+
+    private final MailboxManagerProvider mailboxManagerProvider;
+    
+    public SystemMessageProcessor(ImapProcessor next, final 
MailboxManagerProvider mailboxManagerProvider) {
+        super(next);
+        this.mailboxManagerProvider = mailboxManagerProvider;
+    }
+
+    @Override
+    protected void doProcess(ImapMessage acceptableMessage, Responder 
responder, ImapSession session) {
+        try {
+            final SystemMessage message = (SystemMessage) acceptableMessage;
+            switch (message) {
+                case FORCE_LOGOUT:
+                    forceLogout(session);
+                    break;
+            } 
+        } catch (MailboxException e) {
+            final Log log = session.getLog();
+            log.warn("Force logout failed " + e.getMessage());
+            log.debug("Cannot force logout", e);
+        }
+    }
+
+    /**
+     * Forces a logout of any mailbox session.
+     * @param imapSession not null
+     * @throws MailboxException when forced logout fails
+     */
+    private void forceLogout(ImapSession imapSession) throws MailboxException {
+        final MailboxSession session = 
ImapSessionUtils.getMailboxSession(imapSession);
+        if (session == null) {
+            imapSession.getLog().trace("No mailbox session so no force logout 
needed");
+        } else {
+            session.close();
+            final MailboxManager manager = 
mailboxManagerProvider.getMailboxManager();
+            manager.logout(session, true);
+        }
+    }
+
+    @Override
+    protected boolean isAcceptable(ImapMessage message) {
+        return message instanceof SystemMessage;
+    }
+
+}

Propchange: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SystemMessageProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java?rev=774425&r1=774424&r2=774425&view=diff
==============================================================================
--- 
james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java
 (original)
+++ 
james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapRequestHandler.java
 Wed May 13 16:47:29 2009
@@ -37,6 +37,7 @@
 import org.apache.james.imap.encode.ImapEncoder;
 import org.apache.james.imap.encode.ImapResponseComposer;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
+import org.apache.james.imap.message.request.SystemMessage;
 
 /**
  * @version $Revision: 109034 $
@@ -159,6 +160,7 @@
         } catch (Throwable t) {
             session.getLog().debug("Failed to write ABANDON_SIGNOFF", t);
         }
+        processor.process(SystemMessage.FORCE_LOGOUT, new SilentResponder(), 
session);
     }
 
     private boolean doProcessRequest(ImapRequestLineReader request,
@@ -182,6 +184,16 @@
         return result;
     }
 
+    /**
+     * Silents swallows all responses.
+     */
+    private static final class SilentResponder implements Responder {
+
+        public void respond(ImapResponseMessage message) {
+            // Swallow
+        }
+    }
+    
     private static final class ResponseEncoder implements Responder {
         private final ImapEncoder encoder;
         private final ImapSession session;



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

Reply via email to