MAILBOX-270: mailbox store defines the quota, data size of at least 1024 and number of annotations at least 10
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/af731a6b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/af731a6b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/af731a6b Branch: refs/heads/master Commit: af731a6bffe6e202cac8a2afff25c0c62bb9af8f Parents: 32ac285 Author: Quynh Nguyen <[email protected]> Authored: Mon Sep 12 11:10:06 2016 +0700 Committer: Quynh Nguyen <[email protected]> Committed: Wed Nov 9 11:39:49 2016 +0700 ---------------------------------------------------------------------- .../apache/james/mailbox/MailboxManager.java | 4 --- .../james/mailbox/MailboxManagerTest.java | 7 ++-- .../cassandra/CassandraMailboxManager.java | 8 +++++ .../mail/CassandraAnnotationMapper.java | 22 +++++++++++- .../cassandra/CassandraMailboxManagerTest.java | 13 ++++++- .../inmemory/InMemoryMailboxManager.java | 6 ++++ .../inmemory/mail/InMemoryAnnotationMapper.java | 11 ++++++ .../inmemory/InMemoryMailboxManagerTest.java | 6 ++-- .../mailbox/store/StoreMailboxManager.java | 37 ++++++++++++++++---- .../mailbox/store/mail/AnnotationMapper.java | 14 ++++++++ .../StoreMailboxManagerAnnotationTest.java | 9 +++-- .../store/mail/model/AnnotationMapperTest.java | 27 ++++++++++++++ .../james/mailbox/copier/MailboxCopierTest.java | 5 ++- .../host/ElasticSearchHostSystem.java | 4 ++- .../InMemoryEventAsynchronousHostSystem.java | 4 ++- .../base/MailboxEventAnalyserTest.java | 2 +- .../apache/james/pop3server/POP3ServerTest.java | 2 +- 17 files changed, 153 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/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 2c5d33f..27fd041 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 @@ -446,8 +446,4 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport { void updateAnnotations(MailboxPath mailboxPath, MailboxSession session, List<MailboxAnnotation> mailboxAnnotations) throws MailboxException, AnnotationException; boolean hasChildren(MailboxPath mailboxPath, MailboxSession session) throws MailboxException; - - void setLimitOfAnnotations(int limitOfAnnotations); - - void setLimitAnnotationSize(int limitAnnotationSize); } http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java index 3b3a313..9986712 100644 --- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java +++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java @@ -385,9 +385,8 @@ public class MailboxManagerTest<T extends MailboxManager> { session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test")); MailboxPath inbox = MailboxPath.inbox(session); mailboxManager.createMailbox(inbox, session); - mailboxManager.setLimitAnnotationSize(10); - mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(MailboxAnnotation.newInstance(PRIVATE_KEY, "DataMoreThan10"))); + mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(MailboxAnnotation.newInstance(PRIVATE_KEY, "The limitation of data is less than 30"))); } @ContractTest @@ -396,11 +395,11 @@ public class MailboxManagerTest<T extends MailboxManager> { session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test")); MailboxPath inbox = MailboxPath.inbox(session); mailboxManager.createMailbox(inbox, session); - mailboxManager.setLimitOfAnnotations(2); ImmutableList.Builder<MailboxAnnotation> builder = ImmutableList.builder(); builder.add(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment1"), "AnyValue")); builder.add(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment2"), "AnyValue")); + builder.add(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment3"), "AnyValue")); mailboxManager.updateAnnotations(inbox, session, builder.build()); } @@ -412,12 +411,12 @@ public class MailboxManagerTest<T extends MailboxManager> { session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test")); MailboxPath inbox = MailboxPath.inbox(session); mailboxManager.createMailbox(inbox, session); - mailboxManager.setLimitOfAnnotations(2); ImmutableList.Builder<MailboxAnnotation> builder = ImmutableList.builder(); builder.add(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment1"), "AnyValue")); builder.add(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment2"), "AnyValue")); builder.add(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment3"), "AnyValue")); + builder.add(MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment4"), "AnyValue")); mailboxManager.updateAnnotations(inbox, session, builder.build()); }} http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/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 fdb0092..358305d 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 @@ -26,6 +26,8 @@ import javax.inject.Inject; import org.apache.james.mailbox.MailboxManager; import org.apache.james.mailbox.MailboxPathLocker; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.acl.GroupMembershipResolver; +import org.apache.james.mailbox.acl.MailboxACLResolver; import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; import org.apache.james.mailbox.acl.UnionMailboxACLResolver; import org.apache.james.mailbox.exception.MailboxException; @@ -59,6 +61,12 @@ public class CassandraMailboxManager extends StoreMailboxManager { this.locker = locker; } + public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, + MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) { + super(mapperFactory, authenticator, aclResolver, groupMembershipResolver, messageParser, messageIdFactory, limitOfAnnotations, limitAnnotationSize); + this.locker = locker; + } + @Override @Inject public void setMessageSearchIndex(MessageSearchIndex index) { http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java index c77842f..bf8da4f 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java @@ -34,6 +34,7 @@ import java.util.stream.Stream; import com.github.steveash.guavate.Guavate; import com.google.common.base.Ascii; +import com.google.common.base.Optional; import org.apache.james.backends.cassandra.utils.CassandraUtils; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.cassandra.table.CassandraAnnotationTable; @@ -98,6 +99,20 @@ public class CassandraAnnotationMapper extends NonTransactionalMapper implements .value(CassandraAnnotationTable.VALUE, mailboxAnnotation.getValue().get())); } + @Override + public boolean exist(MailboxId mailboxId, MailboxAnnotation mailboxAnnotation) { + CassandraId cassandraId = (CassandraId)mailboxId; + Optional<Row> row = Optional.fromNullable(session.execute(getStoredAnnotationsQueryByKey(cassandraId, mailboxAnnotation.getKey().asString())) + .one()); + return row.isPresent(); + } + + @Override + public int countAnnotations(MailboxId mailboxId) { + CassandraId cassandraId = (CassandraId)mailboxId; + return session.execute(getStoredAnnotationsQuery(cassandraId)).getAvailableWithoutFetching(); + } + private MailboxAnnotation toAnnotation(Row row) { return MailboxAnnotation.newInstance(new MailboxAnnotationKey(row.getString(CassandraAnnotationTable.KEY)), row.getString(CassandraAnnotationTable.VALUE)); @@ -120,7 +135,12 @@ public class CassandraAnnotationMapper extends NonTransactionalMapper implements .and(gte(CassandraAnnotationTable.KEY, key)) .and(lte(CassandraAnnotationTable.KEY, buildNextKey(key))); } - + + private Select.Where getStoredAnnotationsQueryByKey(CassandraId mailboxId, String key) { + return getStoredAnnotationsQuery(mailboxId) + .and(eq(CassandraAnnotationTable.KEY, key)); + } + private String buildNextKey(String key) { return key + MailboxAnnotationKey.SLASH_CHARACTER + Ascii.MAX; } http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java index 82c502b..cb00e12 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java @@ -20,6 +20,10 @@ package org.apache.james.mailbox.cassandra; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.init.CassandraModuleComposite; +import org.apache.james.mailbox.acl.GroupMembershipResolver; +import org.apache.james.mailbox.acl.MailboxACLResolver; +import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; +import org.apache.james.mailbox.acl.UnionMailboxACLResolver; import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider; import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; @@ -46,6 +50,8 @@ import com.google.common.base.Throwables; @RunWith(ContractSuite.class) @ContractImpl(CassandraMailboxManager.class) public class CassandraMailboxManagerTest { + private static final int LIMIT_ANNOTATIONS = 3; + private static final int LIMIT_ANNOTATION_SIZE = 30; private static final CassandraCluster CASSANDRA = CassandraCluster.create(new CassandraModuleComposite( new CassandraAclModule(), @@ -72,7 +78,12 @@ public class CassandraMailboxManagerTest { CASSANDRA.getTypesProvider(), messageIdFactory); - CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, null, new NoMailboxPathLocker(), new MessageParser(), messageIdFactory); + MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); + GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); + MessageParser messageParser = new MessageParser(); + + CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, null, new NoMailboxPathLocker(), aclResolver, groupMembershipResolver, + messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE); try { manager.init(); } catch (MailboxException e) { http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/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 index 4f77b52..3310a17 100644 --- 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 @@ -45,6 +45,12 @@ public class InMemoryMailboxManager extends StoreMailboxManager { super(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory); } + public InMemoryMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, MailboxACLResolver aclResolver, + GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, + MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) { + super(mailboxSessionMapperFactory, authenticator, aclResolver, groupMembershipResolver, messageParser, messageIdFactory, limitOfAnnotations, limitAnnotationSize); + } + @Override public EnumSet<MailboxCapabilities> getSupportedMailboxCapabilities() { return EnumSet.of(MailboxCapabilities.Move, MailboxCapabilities.UserFlag, MailboxCapabilities.Namespace, MailboxCapabilities.Annotation); http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java index 52a166b..3325f9d 100644 --- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java +++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java @@ -160,4 +160,15 @@ public class InMemoryAnnotationMapper implements AnnotationMapper { } } + @Override + public boolean exist(MailboxId mailboxId, MailboxAnnotation mailboxAnnotation) { + return mailboxesAnnotations.contains((InMemoryId)mailboxId, mailboxAnnotation.getKey().asString()); + } + + @Override + public int countAnnotations(MailboxId mailboxId) { + return mailboxesAnnotations.row((InMemoryId)mailboxId).size(); + } + + } http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/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 b3c8d19..40760be 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 @@ -25,7 +25,6 @@ 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.model.MessageId; -import org.apache.james.mailbox.store.JVMMailboxPathLocker; import org.apache.james.mailbox.store.FakeAuthenticator; import org.apache.james.mailbox.store.mail.model.DefaultMessageId; import org.apache.james.mailbox.store.mail.model.impl.MessageParser; @@ -40,6 +39,8 @@ import com.google.common.base.Throwables; @RunWith(ContractSuite.class) @ContractImpl(InMemoryMailboxManager.class) public class InMemoryMailboxManagerTest { + private static final int LIMIT_ANNOTATIONS = 3; + private static final int LIMIT_ANNOTATION_SIZE = 30; private IProducer<InMemoryMailboxManager> producer = new IProducer<InMemoryMailboxManager>() { @@ -50,9 +51,10 @@ public class InMemoryMailboxManagerTest { MessageParser messageParser = new MessageParser(); InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory(); + MessageId.Factory messageIdFactory = new DefaultMessageId.Factory(); InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, new FakeAuthenticator(), - new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory); + aclResolver, groupMembershipResolver, messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE); try { mailboxManager.init(); http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/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 cc2cf1b..c866188 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 @@ -45,6 +45,7 @@ import org.apache.james.mailbox.RequestAware; import org.apache.james.mailbox.StandardMailboxMetaDataComparator; import org.apache.james.mailbox.acl.GroupMembershipResolver; import org.apache.james.mailbox.acl.MailboxACLResolver; +import org.apache.james.mailbox.exception.AnnotationException; import org.apache.james.mailbox.exception.BadCredentialsException; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxExistsException; @@ -130,11 +131,28 @@ public class StoreMailboxManager implements MailboxManager { private final MessageParser messageParser; private final Factory messageIdFactory; + private final int limitOfAnnotations; + + private final int limitAnnotationSize; @Inject public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, MessageId.Factory messageIdFactory) { + this(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory, + MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE); + } + + public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, + MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, + MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) { + this(mailboxSessionMapperFactory, authenticator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory, + MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE); + } + + public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, + MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, + MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) { this.authenticator = authenticator; this.locker = locker; this.mailboxSessionMapperFactory = mailboxSessionMapperFactory; @@ -142,12 +160,8 @@ public class StoreMailboxManager implements MailboxManager { this.groupMembershipResolver = groupMembershipResolver; this.messageParser = messageParser; this.messageIdFactory = messageIdFactory; - } - - public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, - MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, - MessageId.Factory messageIdFactory) { - this(mailboxSessionMapperFactory, authenticator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory); + this.limitOfAnnotations = limitOfAnnotations; + this.limitAnnotationSize = limitAnnotationSize; } protected Factory getMessageIdFactory() { @@ -831,6 +845,17 @@ public class StoreMailboxManager implements MailboxManager { }); } + private boolean canInsertOrUpdate(MailboxId mailboxId, MailboxAnnotation annotation, AnnotationMapper annotationMapper) throws AnnotationException { + if (annotation.size() > limitAnnotationSize) { + throw new AnnotationException("annotation too big."); + } + if (!annotationMapper.exist(mailboxId, annotation) + && annotationMapper.countAnnotations(mailboxId) >= limitOfAnnotations) { + throw new AnnotationException("too many annotations."); + } + return true; + } + @Override public boolean hasCapability(MailboxCapabilities capability) { return getSupportedMailboxCapabilities().contains(capability); http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AnnotationMapper.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AnnotationMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AnnotationMapper.java index 4617ed4..ec775de 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AnnotationMapper.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AnnotationMapper.java @@ -84,4 +84,18 @@ public interface AnnotationMapper extends Mapper { */ void insertAnnotation(MailboxId mailboxId, MailboxAnnotation mailboxAnnotation); + /** + * Checking the current annotation of selected mailbox exists on store or not. It's checked by annotation key, not by its value. + * + * @param mailboxId the selected mailbox + * @param mailboxAnnotation current annotation should be checked + * @return boolean should be 'true' if it already existed on store + */ + boolean exist(MailboxId mailboxId, MailboxAnnotation mailboxAnnotation); + + /** + * Getting total number of current annotation on mailbox + * + */ + int countAnnotations(MailboxId mailboxId); } http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java index 9fe822c..ce62bb5 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java @@ -19,6 +19,7 @@ package org.apache.james.mailbox.store; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; @@ -27,8 +28,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.assertj.core.api.Assertions.assertThat; - import java.util.Collections; import java.util.List; import java.util.Set; @@ -39,6 +38,7 @@ import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.MailboxAnnotation; import org.apache.james.mailbox.model.MailboxAnnotationKey; +import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.model.MessageId; @@ -49,7 +49,6 @@ import org.apache.james.mailbox.store.mail.model.impl.MessageParser; import org.apache.james.mailbox.store.transaction.Mapper; import org.junit.Before; import org.junit.Test; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; @@ -82,7 +81,6 @@ public class StoreMailboxManagerAnnotationTest { @Mock private MailboxId mailboxId; @Mock private MessageId.Factory messageIdFactory; - @InjectMocks private StoreMailboxManager storeMailboxManager; @@ -102,7 +100,8 @@ public class StoreMailboxManagerAnnotationTest { } }); - storeMailboxManager = spy(new StoreMailboxManager(mailboxSessionMapperFactory, authenticator, aclResolver, groupMembershipResolver, messageParser, messageIdFactory)); + storeMailboxManager = spy(new StoreMailboxManager(mailboxSessionMapperFactory, authenticator, aclResolver, groupMembershipResolver, + messageParser, messageIdFactory, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE)); storeMailboxManager.init(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java index 80b3adb..fdefd97 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java @@ -207,4 +207,31 @@ public class AnnotationMapperTest<T extends MapperProvider> { assertThat(annotationMapper.getAllAnnotations(mailboxId)).containsOnly(PRIVATE_ANNOTATION_WITH_KEY_UPPER); } + + @ContractTest + public void isExistedShouldReturnTrueIfAnnotationIsStored() throws Exception { + annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION); + + assertThat(annotationMapper.exist(mailboxId, PRIVATE_ANNOTATION)).isTrue(); + } + + @ContractTest + public void isExistedShouldReturnFalseIfAnnotationIsNotStored() throws Exception { + assertThat(annotationMapper.exist(mailboxId, PRIVATE_ANNOTATION)).isFalse(); + } + + @ContractTest + public void countAnnotationShouldReturnZeroIfNoMoreAnnotationBelongToMailbox() throws Exception { + assertThat(annotationMapper.countAnnotations(mailboxId)).isEqualTo(0); + } + + @ContractTest + public void countAnnotationShouldReturnNumberOfAnnotationBelongToMailbox() throws Exception { + annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION); + annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION_UPDATE); + annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION); + annotationMapper.insertAnnotation(mailboxId, PRIVATE_USER_ANNOTATION); + + assertThat(annotationMapper.countAnnotations(mailboxId)).isEqualTo(3); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java ---------------------------------------------------------------------- diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java index 0727e9a..02ae1e6 100644 --- a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java +++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java @@ -35,6 +35,7 @@ import org.apache.james.mailbox.exception.BadCredentialsException; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; import org.apache.james.mailbox.mock.MockMailboxManager; +import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.Authenticator; import org.apache.james.mailbox.store.StoreMailboxManager; @@ -168,7 +169,9 @@ public class MailboxCopierTest { aclResolver, groupMembershipResolver, messageParser, - new DefaultMessageId.Factory() + new DefaultMessageId.Factory(), + MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, + MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE ); } http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java index a985dc3..3fc1893 100644 --- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java +++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java @@ -46,6 +46,7 @@ import org.apache.james.mailbox.elasticsearch.utils.TestingClientProvider; 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.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.FakeAuthenticator; import org.apache.james.mailbox.store.StoreMailboxManager; @@ -114,7 +115,8 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem { GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); MessageParser messageParser = new MessageParser(); - mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory()); + mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser, + new DefaultMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE); mailboxManager.setMessageSearchIndex(searchIndex); try { http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java index aa62f7e..20522df 100644 --- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java +++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java @@ -31,6 +31,7 @@ import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; import org.apache.james.mailbox.inmemory.quota.InMemoryCurrentQuotaManager; import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager; +import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.quota.QuotaRootResolver; import org.apache.james.mailbox.store.FakeAuthenticator; @@ -81,7 +82,8 @@ public class InMemoryEventAsynchronousHostSystem extends JamesImapHostSystem { GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); MessageParser messageParser = new MessageParser(); - mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory()); + mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser, + new DefaultMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE); QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(factory); InMemoryPerUserMaxQuotaManager perUserMaxQuotaManager = new InMemoryPerUserMaxQuotaManager(); http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/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 7a5928b..9b889df 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 @@ -33,6 +33,7 @@ import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import javax.mail.Flags; @@ -443,7 +444,6 @@ public class MailboxEventAnalyserTest { public boolean hasChildren(MailboxPath mailboxPath, MailboxSession session) throws MailboxException { return false; } - }; private final class MyMailboxSession implements MailboxSession { http://git-wip-us.apache.org/repos/asf/james-project/blob/af731a6b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java index 337e4af..730237e 100644 --- a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java +++ b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java @@ -726,7 +726,7 @@ public class POP3ServerTest { return false; } } - }, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory()); + }, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE); mailboxManager.init(); protocolHandlerChain.put("mailboxmanager", MailboxManager.class, mailboxManager); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
