IMAP-370 In Memory implementation for the MOVE method
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6a90560a Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6a90560a Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6a90560a Branch: refs/heads/master Commit: 6a90560af84d2b1d01fb8573b6ee57be6a761e2b Parents: ca531c0 Author: Benoit Tellier <[email protected]> Authored: Thu Mar 3 16:43:06 2016 +0700 Committer: Benoit Tellier <[email protected]> Committed: Fri Mar 4 19:35:24 2016 +0700 ---------------------------------------------------------------------- .../inmemory/InMemoryMailboxManager.java | 43 +++++++++++++++++++ .../inmemory/mail/InMemoryMessageMapper.java | 28 ++++++------ .../inmemory/InMemoryMailboxManagerTest.java | 8 ++-- .../inmemory/mail/InMemoryMapperProvider.java | 45 ++++++++++++++++++++ .../inmemory/mail/InMemoryMessageMoveTest.java | 30 +++++++++++++ .../manager/InMemoryIntegrationResources.java | 4 +- .../mail/model/AbstractMessageMoveTest.java | 4 +- .../inmemory/InMemoryMailboxTest.java | 4 +- .../inmemory/host/InMemoryHostSystem.java | 15 +++---- 9 files changed, 152 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java new file mode 100644 index 0000000..1814766 --- /dev/null +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java @@ -0,0 +1,43 @@ +/**************************************************************** + * 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.mailbox.inmemory; + +import java.util.List; + +import org.apache.james.mailbox.MailboxPathLocker; +import org.apache.james.mailbox.acl.GroupMembershipResolver; +import org.apache.james.mailbox.acl.MailboxACLResolver; +import org.apache.james.mailbox.store.Authenticator; +import org.apache.james.mailbox.store.StoreMailboxManager; + +import com.google.common.collect.Lists; + +public class InMemoryMailboxManager extends StoreMailboxManager<InMemoryId> { + + public InMemoryMailboxManager(Authenticator authenticator, MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver) { + super(new InMemoryMailboxSessionMapperFactory(), authenticator, locker, aclResolver, groupMembershipResolver); + } + + @Override + public List<Capabilities> getSupportedCapabilities() { + return Lists.newArrayList(Capabilities.Basic, Capabilities.Move); + + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java index b201d34..1986946 100644 --- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java @@ -55,10 +55,14 @@ public class InMemoryMessageMapper extends AbstractMessageMapper<InMemoryId> { } private Map<Long, MailboxMessage<InMemoryId>> getMembershipByUidForMailbox(Mailbox<InMemoryId> mailbox) { - Map<Long, MailboxMessage<InMemoryId>> membershipByUid = mailboxByUid.get(mailbox.getMailboxId()); + return getMembershipByUidForId(mailbox.getMailboxId()); + } + + private Map<Long, MailboxMessage<InMemoryId>> getMembershipByUidForId(InMemoryId id) { + Map<Long, MailboxMessage<InMemoryId>> membershipByUid = mailboxByUid.get(id); if (membershipByUid == null) { membershipByUid = new ConcurrentHashMap<Long, MailboxMessage<InMemoryId>>(INITIAL_SIZE); - mailboxByUid.put(mailbox.getMailboxId(), membershipByUid); + mailboxByUid.put(id, membershipByUid); } return membershipByUid; } @@ -91,6 +95,15 @@ public class InMemoryMessageMapper extends AbstractMessageMapper<InMemoryId> { getMembershipByUidForMailbox(mailbox).remove(message.getUid()); } + @Override + public MessageMetaData move(Mailbox<InMemoryId> mailbox, MailboxMessage<InMemoryId> original) throws MailboxException { + InMemoryId originalMailboxId = original.getMailboxId(); + long uid = original.getUid(); + MessageMetaData messageMetaData = copy(mailbox, original); + getMembershipByUidForId(originalMailboxId).remove(uid); + return messageMetaData; + } + /** * @see org.apache.james.mailbox.store.mail.MessageMapper#findInMailbox(org.apache.james.mailbox.store.mail.model.Mailbox, * org.apache.james.mailbox.model.MessageRange, @@ -191,17 +204,6 @@ public class InMemoryMessageMapper extends AbstractMessageMapper<InMemoryId> { } /** - * (non-Javadoc) - * - * @see org.apache.james.mailbox.store.mail.MessageMapper#move(org.apache.james.mailbox.store.mail.model.Mailbox, - * MailboxMessage) - */ - @Override - public MessageMetaData move(Mailbox<InMemoryId> mailbox, MailboxMessage<InMemoryId> original) throws MailboxException { - throw new UnsupportedOperationException("Not implemented - see https://issues.apache.org/jira/browse/IMAP-370"); - } - - /** * Do nothing */ public void endRequest() { http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java index c843f96..f960885 100644 --- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java +++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java @@ -31,6 +31,7 @@ import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxMetaData; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MailboxQuery; +import org.apache.james.mailbox.store.JVMMailboxPathLocker; import org.apache.james.mailbox.store.MockAuthenticator; import org.apache.james.mailbox.store.StoreMailboxManager; import org.junit.After; @@ -67,7 +68,7 @@ public class InMemoryMailboxManagerTest extends AbstractMailboxManagerTest { * @throws BadCredentialsException */ @After - public void tearDown() throws BadCredentialsException, MailboxException { + public void tearDown() throws MailboxException { getMailboxManager().logout(session, true); getMailboxManager().endProcessingRequest(session); getMailboxManager().createSystemSession("test", LoggerFactory.getLogger("Test")).close(); @@ -78,12 +79,11 @@ public class InMemoryMailboxManagerTest extends AbstractMailboxManagerTest { */ @Override protected void createMailboxManager() throws MailboxException { - - InMemoryMailboxSessionMapperFactory factory = new InMemoryMailboxSessionMapperFactory(); + MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); - StoreMailboxManager<InMemoryId> mailboxManager = new StoreMailboxManager<InMemoryId>(factory, new MockAuthenticator(), aclResolver, groupMembershipResolver); + StoreMailboxManager<InMemoryId> mailboxManager = new InMemoryMailboxManager(new MockAuthenticator(), new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver); mailboxManager.init(); setMailboxManager(mailboxManager); http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java new file mode 100644 index 0000000..c0ce7fb --- /dev/null +++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java @@ -0,0 +1,45 @@ +package org.apache.james.mailbox.inmemory.mail; + +import java.util.Random; + +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.inmemory.InMemoryId; +import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; +import org.apache.james.mailbox.mock.MockMailboxSession; +import org.apache.james.mailbox.store.mail.MailboxMapper; +import org.apache.james.mailbox.store.mail.MessageMapper; +import org.apache.james.mailbox.store.mail.model.MapperProvider; + +public class InMemoryMapperProvider implements MapperProvider<InMemoryId> { + + private final Random random; + + public InMemoryMapperProvider() { + random = new Random(); + } + + @Override + public MailboxMapper<InMemoryId> createMailboxMapper() throws MailboxException { + return new InMemoryMailboxSessionMapperFactory().createMailboxMapper(new MockMailboxSession("user")); + } + + @Override + public MessageMapper<InMemoryId> createMessageMapper() throws MailboxException { + return new InMemoryMailboxSessionMapperFactory().createMessageMapper(new MockMailboxSession("user")); + } + + @Override + public InMemoryId generateId() { + return InMemoryId.of(random.nextInt()); + } + + @Override + public void clearMapper() throws MailboxException { + + } + + @Override + public void ensureMapperPrepared() throws MailboxException { + + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java new file mode 100644 index 0000000..0a1aaa3 --- /dev/null +++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMoveTest.java @@ -0,0 +1,30 @@ +/**************************************************************** + * 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.mailbox.inmemory.mail; + +import org.apache.james.mailbox.inmemory.InMemoryId; +import org.apache.james.mailbox.store.mail.model.AbstractMessageMoveTest; + +public class InMemoryMessageMoveTest extends AbstractMessageMoveTest<InMemoryId> { + + public InMemoryMessageMoveTest() { + super(new InMemoryMapperProvider()); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java index be94e75..b9c6f9d 100644 --- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java +++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java @@ -25,6 +25,7 @@ import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; import org.apache.james.mailbox.acl.UnionMailboxACLResolver; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.inmemory.InMemoryId; +import org.apache.james.mailbox.inmemory.InMemoryMailboxManager; import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; import org.apache.james.mailbox.inmemory.quota.InMemoryCurrentQuotaManager; import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager; @@ -52,8 +53,7 @@ public class InMemoryIntegrationResources implements IntegrationResources { MockAuthenticator mockAuthenticator = new MockAuthenticator(); mockAuthenticator.addUser(ManagerTestResources.USER, ManagerTestResources.USER_PASS); MailboxSessionMapperFactory<InMemoryId> factory = new InMemoryMailboxSessionMapperFactory(); - final StoreMailboxManager<InMemoryId> manager = new StoreMailboxManager<InMemoryId>( - factory, + final StoreMailboxManager<InMemoryId> manager = new InMemoryMailboxManager( mockAuthenticator, new NoMailboxPathLocker(), new UnionMailboxACLResolver(), http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMoveTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMoveTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMoveTest.java index ed38feb..6a44f54 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMoveTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AbstractMessageMoveTest.java @@ -89,7 +89,9 @@ public abstract class AbstractMessageMoveTest<Id extends MailboxId> { MessageMetaData messageMetaData = messageMapper.move(benwaWorkMailbox, message1); - assertThat(messageMetaData.getFlags()).isEqualTo(message1.createFlags()); + Flags expectedFlags = message1.createFlags(); + expectedFlags.add(Flags.Flag.RECENT); + assertThat(messageMetaData.getFlags()).isEqualTo(expectedFlags); assertThat(messageMetaData.getUid()).isEqualTo(messageMapper.getLastUid(benwaWorkMailbox)); assertThat(messageMetaData.getModSeq()).isEqualTo(messageMapper.getHighestModSeq(benwaWorkMailbox)); } http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java index c632abe..26b475e 100644 --- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java +++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java @@ -27,6 +27,7 @@ import org.apache.james.mpt.imapmailbox.suite.FetchBodySection; import org.apache.james.mpt.imapmailbox.suite.FetchBodyStructure; import org.apache.james.mpt.imapmailbox.suite.FetchHeaders; import org.apache.james.mpt.imapmailbox.suite.Listing; +import org.apache.james.mpt.imapmailbox.suite.Move; import org.apache.james.mpt.imapmailbox.suite.NonAuthenticatedState; import org.apache.james.mpt.imapmailbox.suite.PartialFetch; import org.apache.james.mpt.imapmailbox.suite.QuotaTest; @@ -62,7 +63,8 @@ import org.junit.runners.Suite; SelectedInbox.class, SelectedState.class, UidSearch.class, - QuotaTest.class + QuotaTest.class, + Move.class }) @GuiceModules({ InMemoryMailboxTestModule.class }) public class InMemoryMailboxTest { http://git-wip-us.apache.org/repos/asf/james-project/blob/6a90560a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java index 3fa9e82..d054fe1 100644 --- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java +++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java @@ -29,13 +29,13 @@ import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; import org.apache.james.mailbox.acl.UnionMailboxACLResolver; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.inmemory.InMemoryId; -import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; +import org.apache.james.mailbox.inmemory.InMemoryMailboxManager; import org.apache.james.mailbox.inmemory.quota.InMemoryCurrentQuotaManager; import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.quota.QuotaRootResolver; +import org.apache.james.mailbox.store.JVMMailboxPathLocker; import org.apache.james.mailbox.store.MockAuthenticator; -import org.apache.james.mailbox.store.StoreMailboxManager; import org.apache.james.mailbox.store.StoreSubscriptionManager; import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator; import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver; @@ -50,7 +50,7 @@ public class InMemoryHostSystem extends JamesImapHostSystem { private static final ImapFeatures SUPPORTED_FEATURES = ImapFeatures.of(Feature.NAMESPACE_SUPPORT); - private StoreMailboxManager<InMemoryId> mailboxManager; + private InMemoryMailboxManager mailboxManager; private MockAuthenticator userManager; public static JamesImapHostSystem build() throws Exception { @@ -73,19 +73,18 @@ public class InMemoryHostSystem extends JamesImapHostSystem { private void initFields() throws MailboxException { userManager = new MockAuthenticator(); - InMemoryMailboxSessionMapperFactory factory = new InMemoryMailboxSessionMapperFactory(); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); - mailboxManager = new StoreMailboxManager<InMemoryId>(factory, userManager, aclResolver, groupMembershipResolver); - QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(factory); + mailboxManager = new InMemoryMailboxManager(userManager, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver); + QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mailboxManager.getMapperFactory()); InMemoryPerUserMaxQuotaManager perUserMaxQuotaManager = new InMemoryPerUserMaxQuotaManager(); perUserMaxQuotaManager.setDefaultMaxMessage(4096); perUserMaxQuotaManager.setDefaultMaxStorage(5L * 1024L * 1024L * 1024L); InMemoryCurrentQuotaManager currentQuotaManager = new InMemoryCurrentQuotaManager( - new CurrentQuotaCalculator<InMemoryId>(factory, quotaRootResolver), + new CurrentQuotaCalculator<InMemoryId>(mailboxManager.getMapperFactory(), quotaRootResolver), mailboxManager); StoreQuotaManager quotaManager = new StoreQuotaManager(); @@ -102,7 +101,7 @@ public class InMemoryHostSystem extends JamesImapHostSystem { mailboxManager.init(); - final ImapProcessor defaultImapProcessorFactory = DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, new StoreSubscriptionManager(factory), quotaManager, quotaRootResolver); + final ImapProcessor defaultImapProcessorFactory = DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, new StoreSubscriptionManager(mailboxManager.getMapperFactory()), quotaManager, quotaRootResolver); configure(new DefaultImapDecoderFactory().buildImapDecoder(), new DefaultImapEncoderFactory().buildImapEncoder(), defaultImapProcessorFactory); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
