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]

Reply via email to