IMAP-370 MOVE capability should be exposed and MoveProcessor enabled only if 
implemented by the MailboxManager


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f37d2b42
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f37d2b42
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f37d2b42

Branch: refs/heads/master
Commit: f37d2b42a8121827a0092ca71a6e3b35d78004fc
Parents: 7958d56
Author: Benoit Tellier <btell...@linagora.com>
Authored: Thu Feb 25 13:30:44 2016 +0700
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Fri Mar 4 19:35:24 2016 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MailboxManager.java    |  7 +++
 .../cassandra/CassandraMailboxManager.java      |  9 ++++
 .../mailbox/store/StoreMailboxManager.java      |  7 +++
 .../imap/processor/DefaultProcessorChain.java   | 10 +++-
 .../james/imap/processor/MoveProcessor.java     | 53 ++++++++++++++------
 .../james/imap/processor/MoveProcessorTest.java | 14 ++++++
 .../base/MailboxEventAnalyserTest.java          | 10 +++-
 7 files changed, 90 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index 712291d..22cad9d 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -69,6 +69,13 @@ import org.slf4j.Logger;
 
 public interface MailboxManager extends RequestAware, MailboxListenerSupport {
 
+    enum Capabilities {
+        Basic,
+        Move
+    }
+
+    List<Capabilities> getSupportedCapabilities();
+
     /**
      * Return the delimiter to use for folders
      * 

http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
index 2f8c736..369a928 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.cassandra;
 
+import java.util.List;
+
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
@@ -36,6 +38,8 @@ import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 
+import com.google.common.collect.Lists;
+
 /**
  * Cassandra implementation of {@link StoreMailboxManager}
  */
@@ -60,6 +64,11 @@ public class CassandraMailboxManager extends 
StoreMailboxManager<CassandraId> {
     }
 
     @Override
+    public List<Capabilities> getSupportedCapabilities() {
+        return Lists.newArrayList(Capabilities.Basic, Capabilities.Move);
+    }
+
+    @Override
     protected Mailbox<CassandraId> doCreateMailbox(MailboxPath mailboxPath, 
MailboxSession session) throws MailboxException {
         SimpleMailbox<CassandraId> cassandraMailbox = new 
SimpleMailbox<>(mailboxPath, randomUidValidity());
         cassandraMailbox.setACL(SimpleMailboxACL.EMPTY);

http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 9262a87..4d7f463 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -71,6 +71,8 @@ import org.apache.james.mailbox.store.transaction.Mapper;
 import org.apache.james.mailbox.store.transaction.TransactionalMapper;
 import org.slf4j.Logger;
 
+import com.google.common.collect.Lists;
+
 /**
  * This base class of an {@link MailboxManager} implementation provides a 
high-level api for writing your own
  * {@link MailboxManager} implementation. If you plan to write your own {@link 
MailboxManager} its most times so easiest
@@ -196,6 +198,11 @@ public class StoreMailboxManager<Id extends MailboxId> 
implements MailboxManager
         }
     }
 
+    @Override
+    public List<Capabilities> getSupportedCapabilities() {
+        return Lists.newArrayList(Capabilities.Basic);
+    }
+
     /**
      * Return the {@link DelegatingMailboxListener} which is used by this 
{@link MailboxManager}
      *

http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
index a3d655d..176f347 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
@@ -57,8 +57,14 @@ public class DefaultProcessorChain {
         final UnsubscribeProcessor unsubscribeProcessor = new 
UnsubscribeProcessor(closeProcessor, mailboxManager, subscriptionManager, 
statusResponseFactory);
         final SubscribeProcessor subscribeProcessor = new 
SubscribeProcessor(unsubscribeProcessor, mailboxManager, subscriptionManager, 
statusResponseFactory);
         final CopyProcessor copyProcessor = new 
CopyProcessor(subscribeProcessor, mailboxManager, statusResponseFactory);
-        final MoveProcessor moveProcessor = new MoveProcessor(copyProcessor, 
mailboxManager, statusResponseFactory);
-        final AuthenticateProcessor authenticateProcessor = new 
AuthenticateProcessor(moveProcessor, mailboxManager, statusResponseFactory);
+        AuthenticateProcessor authenticateProcessor;
+        if 
(mailboxManager.getSupportedCapabilities().contains(MailboxManager.Capabilities.Move))
 {
+            final MoveProcessor moveProcessor = new 
MoveProcessor(copyProcessor, mailboxManager, statusResponseFactory);
+            authenticateProcessor = new AuthenticateProcessor(moveProcessor, 
mailboxManager, statusResponseFactory);
+            capabilityProcessor.addProcessor(moveProcessor);
+        } else {
+            authenticateProcessor = new AuthenticateProcessor(copyProcessor, 
mailboxManager, statusResponseFactory);
+        }
         final ExpungeProcessor expungeProcessor = new 
ExpungeProcessor(authenticateProcessor, mailboxManager, statusResponseFactory);
         final ExamineProcessor examineProcessor = new 
ExamineProcessor(expungeProcessor, mailboxManager, statusResponseFactory);
         final AppendProcessor appendProcessor = new 
AppendProcessor(examineProcessor, mailboxManager, statusResponseFactory);

http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
index ca8e612..a2a2f84 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
@@ -1,6 +1,24 @@
+/****************************************************************
+ * 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 java.util.Collections;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
@@ -15,33 +33,36 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 
+import com.google.common.collect.ImmutableList;
+
 public class MoveProcessor extends AbstractMessageRangeProcessor<MoveRequest> 
implements CapabilityImplementingProcessor {
 
-       private static final List<String> CAPS = 
Collections.unmodifiableList(Collections.singletonList(ImapConstants.MOVE_COMMAND_NAME));
+    private final boolean moveCapabilitySupported;
 
-       public MoveProcessor(ImapProcessor next, MailboxManager mailboxManager, 
StatusResponseFactory factory) {
-               super(MoveRequest.class, next, mailboxManager, factory);
-       }
+    public MoveProcessor(ImapProcessor next, MailboxManager mailboxManager, 
StatusResponseFactory factory) {
+        super(MoveRequest.class, next, mailboxManager, factory);
+        moveCapabilitySupported = 
mailboxManager.getSupportedCapabilities().contains(MailboxManager.Capabilities.Move);
+    }
 
     @Override
-    protected List<MessageRange> process(MailboxPath targetMailbox,
-                                         SelectedMailbox currentMailbox,
+    protected List<MessageRange> process(MailboxPath targetMailbox, 
SelectedMailbox currentMailbox,
                                          MailboxSession mailboxSession,
                                          MailboxManager mailboxManager, 
MessageRange messageSet) throws MailboxException {
-               return mailboxManager.moveMessages(messageSet, 
currentMailbox.getPath(), targetMailbox, mailboxSession);
-       }
+        return mailboxManager.moveMessages(messageSet, 
currentMailbox.getPath(), targetMailbox, mailboxSession);
+    }
 
     @Override
     protected String getOperationName() {
         return "Move";
     }
 
-    /**
-    * @see org.apache.james.imap.processor.CapabilityImplementingProcessor
-    * 
#getImplementedCapabilities(org.apache.james.imap.api.process.ImapSession)
-    */
-       public List<String> getImplementedCapabilities(ImapSession session) {
-               return CAPS;
-       }
+    @Override
+    public List<String> getImplementedCapabilities(ImapSession session) {
+        if (moveCapabilitySupported) {
+            return ImmutableList.of(ImapConstants.MOVE_COMMAND_NAME);
+        } else {
+            return ImmutableList.of();
+        }
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
index 3b9ee72..63b299e 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -74,7 +75,20 @@ public class MoveProcessorTest {
         mockImapSession = mock(ImapSession.class);
         mockMailboxSession = mock(MailboxSession.class);
 
+        
when(mockMailboxManager.getSupportedCapabilities()).thenReturn(Lists.newArrayList(MailboxManager.Capabilities.Move,
 MailboxManager.Capabilities.Basic));
         testee = new MoveProcessor(mockNextProcessor, mockMailboxManager, 
mockStatusResponseFactory);
+        verify(mockMailboxManager).getSupportedCapabilities();
+    }
+
+    @Test
+    public void 
getImplementedCapabilitiesShouldContainMoveWhenSupportedByMailboxManager() {
+        
assertThat(testee.getImplementedCapabilities(null)).containsExactly(ImapConstants.MOVE_COMMAND_NAME);
+    }
+
+    @Test
+    public void 
getImplementedCapabilitiesShouldNotContainMoveWhenUnSupportedByMailboxManager() 
{
+        
when(mockMailboxManager.getSupportedCapabilities()).thenReturn(Lists.newArrayList(MailboxManager.Capabilities.Basic));
+        assertThat(new MoveProcessor(mockNextProcessor, mockMailboxManager, 
mockStatusResponseFactory).getImplementedCapabilities(null)).isEmpty();
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/f37d2b42/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index e7b9547..d5286b3 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -66,6 +66,8 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.junit.Test;
 import org.slf4j.Logger;
 
+import com.google.common.collect.Lists;
+
 public class MailboxEventAnalyserTest {
 
     private static final long BASE_SESSION_ID = 99;
@@ -73,8 +75,12 @@ public class MailboxEventAnalyserTest {
     
     private MailboxPath mailboxPath = new MailboxPath("namespace", "user", 
"name");
     private final MailboxManager mockManager = new MailboxManager() {
-        
-        
+
+        @Override
+        public List<Capabilities> getSupportedCapabilities() {
+            return Lists.newArrayList(Capabilities.Basic);
+        }
+
         public void removeListener(MailboxPath mailboxPath, MailboxListener 
listner, MailboxSession session) throws MailboxException {
             
         }


---------------------------------------------------------------------
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