You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2015/09/22 12:23:07 UTC

svn commit: r1704537 - in /james/mailbox/trunk: cassandra/src/main/java/org/apache/james/mailbox/cassandra/ hbase/src/main/java/org/apache/james/mailbox/hbase/ jcr/src/main/java/org/apache/james/mailbox/jcr/ jpa/src/main/java/org/apache/james/mailbox/j...

Author: btellier
Date: Tue Sep 22 10:23:04 2015
New Revision: 1704537

URL: http://svn.apache.org/viewvc?rev=1704537&view=rev
Log:
MAILBOX-64 MessageManager should check quotas on APPEND and COPY operations

Added:
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
    james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
Modified:
    james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
    james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
    james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
    james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
    james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
    james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
    james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
    james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java

Modified: james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java (original)
+++ james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java Tue Sep 22 10:23:04 2015
@@ -39,7 +39,11 @@ public class CassandraMailboxManager ext
     private MailboxPathLocker locker;
 
     public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, final MailboxPathLocker locker) {
-        super(mapperFactory, authenticator, locker, new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver());
+        super(mapperFactory,
+            authenticator,
+            locker,
+            new UnionMailboxACLResolver(),
+            new SimpleGroupMembershipResolver());
         this.locker = locker;
     }
 
@@ -52,7 +56,13 @@ public class CassandraMailboxManager ext
 
     @Override
     protected StoreMessageManager<CassandraId> createMessageManager(Mailbox<CassandraId> mailboxRow, MailboxSession session) throws MailboxException {
-        return new CassandraMessageManager(getMapperFactory(), getMessageSearchIndex(), getEventDispatcher(), this.locker, mailboxRow);
+        return new CassandraMessageManager(getMapperFactory(),
+            getMessageSearchIndex(),
+            getEventDispatcher(),
+            this.locker,
+            mailboxRow,
+            getQuotaManager(),
+            getQuotaRootResolver());
     }
 
 }

Modified: james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java (original)
+++ james/mailbox/trunk/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMessageManager.java Tue Sep 22 10:23:04 2015
@@ -26,6 +26,8 @@ import org.apache.james.mailbox.MailboxS
 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.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -38,8 +40,8 @@ import org.apache.james.mailbox.store.se
  */
 public class CassandraMessageManager extends StoreMessageManager<CassandraId> {
 
-    public CassandraMessageManager(MailboxSessionMapperFactory<CassandraId> mapperFactory, MessageSearchIndex<CassandraId> index, MailboxEventDispatcher<CassandraId> dispatcher, MailboxPathLocker locker, Mailbox<CassandraId> mailbox) throws MailboxException {
-        super(mapperFactory, index, dispatcher, locker, mailbox, new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver());
+    public CassandraMessageManager(MailboxSessionMapperFactory<CassandraId> mapperFactory, MessageSearchIndex<CassandraId> index, MailboxEventDispatcher<CassandraId> dispatcher, MailboxPathLocker locker, Mailbox<CassandraId> mailbox, QuotaManager quotaManager, QuotaRootResolver quotaRootResolver) throws MailboxException {
+        super(mapperFactory, index, dispatcher, locker, mailbox, new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), quotaManager, quotaRootResolver);
 
     }
 

Modified: james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java (original)
+++ james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java Tue Sep 22 10:23:04 2015
@@ -82,7 +82,15 @@ public class HBaseMailboxManager extends
 
     @Override
     protected StoreMessageManager<HBaseId> createMessageManager(Mailbox<HBaseId> mailboxRow, MailboxSession session) throws MailboxException {
-        StoreMessageManager<HBaseId> result = new HBaseMessageManager(getMapperFactory(), getMessageSearchIndex(), getEventDispatcher(), getLocker(), mailboxRow, getAclResolver(), getGroupMembershipResolver());
+        StoreMessageManager<HBaseId> result = new HBaseMessageManager(getMapperFactory(),
+            getMessageSearchIndex(),
+            getEventDispatcher(),
+            getLocker(),
+            mailboxRow,
+            getAclResolver(),
+            getGroupMembershipResolver(),
+            getQuotaManager(),
+            getQuotaRootResolver());
         return result;
     }
 }

Modified: james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java (original)
+++ james/mailbox/trunk/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMessageManager.java Tue Sep 22 10:23:04 2015
@@ -25,6 +25,8 @@ import org.apache.james.mailbox.MailboxS
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -38,8 +40,8 @@ import org.apache.james.mailbox.store.se
 public class HBaseMessageManager extends StoreMessageManager<HBaseId> {
 
     public HBaseMessageManager(MailboxSessionMapperFactory<HBaseId> mapperFactory, MessageSearchIndex<HBaseId> index,
-            MailboxEventDispatcher<HBaseId> dispatcher, MailboxPathLocker locker, Mailbox<HBaseId> mailbox, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver) throws MailboxException {
-        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver);
+            MailboxEventDispatcher<HBaseId> dispatcher, MailboxPathLocker locker, Mailbox<HBaseId> mailbox, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, QuotaManager quotaManager, QuotaRootResolver quotaRootResolver) throws MailboxException {
+        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver);
 
     }
 

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java Tue Sep 22 10:23:04 2015
@@ -52,7 +52,16 @@ public class JCRMailboxManager extends S
     
     @Override
     protected StoreMessageManager<JCRId> createMessageManager(Mailbox<JCRId> mailboxEntity, MailboxSession session) throws MailboxException{
-        return new JCRMessageManager(getMapperFactory(), getMessageSearchIndex(), getEventDispatcher(), getLocker(), (JCRMailbox) mailboxEntity, getAclResolver(), getGroupMembershipResolver(), logger, getDelimiter());
+        return new JCRMessageManager(getMapperFactory(),
+            getMessageSearchIndex(),
+            getEventDispatcher(),
+            getLocker(),
+            (JCRMailbox) mailboxEntity,
+            getAclResolver(),
+            getGroupMembershipResolver(),
+            logger,
+            getQuotaManager(),
+            getQuotaRootResolver());
     }
 
     @Override

Modified: james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java (original)
+++ james/mailbox/trunk/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMessageManager.java Tue Sep 22 10:23:04 2015
@@ -30,6 +30,8 @@ import org.apache.james.mailbox.acl.Mail
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.jcr.mail.model.JCRMessage;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -47,8 +49,8 @@ public class JCRMessageManager extends S
     private final Logger log;
 
     public JCRMessageManager(MailboxSessionMapperFactory<JCRId> mapperFactory, MessageSearchIndex<JCRId> index, 
-            final MailboxEventDispatcher<JCRId> dispatcher, final MailboxPathLocker locker, final JCRMailbox mailbox, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, final Logger log, final char delimiter) throws MailboxException {
-        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver);
+            final MailboxEventDispatcher<JCRId> dispatcher, final MailboxPathLocker locker, final JCRMailbox mailbox, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, final Logger log, QuotaManager quotaManager, QuotaRootResolver quotaRootResolver) throws MailboxException {
+        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver);
         this.log = log;
     }
 

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMessageManager.java Tue Sep 22 10:23:04 2015
@@ -30,6 +30,8 @@ import org.apache.james.mailbox.acl.Mail
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -46,9 +48,11 @@ public class JPAMessageManager extends S
     public JPAMessageManager(MailboxSessionMapperFactory<JPAId> mapperFactory, final MessageSearchIndex<JPAId> index, 
     			final MailboxEventDispatcher<JPAId> dispatcher, final MailboxPathLocker locker, 
     			final Mailbox<JPAId> mailbox, MailboxACLResolver aclResolver, 
-    			GroupMembershipResolver groupMembershipResolver) throws MailboxException {
+    			GroupMembershipResolver groupMembershipResolver, QuotaManager quotaManager,
+                QuotaRootResolver quotaRootResolver) throws MailboxException {
     	
-        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver);     
+        super(mapperFactory, index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver,
+            quotaManager, quotaRootResolver);
     }
     
     @Override

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java Tue Sep 22 10:23:04 2015
@@ -68,7 +68,15 @@ public class OpenJPAMailboxManager exten
 
     @Override
     protected StoreMessageManager<JPAId> createMessageManager(Mailbox<JPAId> mailboxRow, MailboxSession session) throws MailboxException {
-        StoreMessageManager<JPAId> result =  new OpenJPAMessageManager(getMapperFactory(), getMessageSearchIndex(), getEventDispatcher(), getLocker(), mailboxRow, feature, getAclResolver(), getGroupMembershipResolver());
-        return result;
+        return new OpenJPAMessageManager(getMapperFactory(),
+            getMessageSearchIndex(),
+            getEventDispatcher(),
+            getLocker(),
+            mailboxRow,
+            feature,
+            getAclResolver(),
+            getGroupMembershipResolver(),
+            getQuotaManager(),
+            getQuotaRootResolver());
     }
 }

Modified: james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java (original)
+++ james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java Tue Sep 22 10:23:04 2015
@@ -33,6 +33,8 @@ import org.apache.james.mailbox.jpa.JPAM
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMessage;
 import org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -56,16 +58,18 @@ public class OpenJPAMessageManager exten
     public OpenJPAMessageManager(MailboxSessionMapperFactory<JPAId> mapperFactory, 
     		MessageSearchIndex<JPAId> index,MailboxEventDispatcher<JPAId> dispatcher, 
     		MailboxPathLocker locker, Mailbox<JPAId> mailbox, MailboxACLResolver aclResolver, 
-    		GroupMembershipResolver groupMembershipResolver) throws MailboxException {
-        this(mapperFactory, index, dispatcher, locker,  mailbox, AdvancedFeature.None, aclResolver, groupMembershipResolver);
+    		GroupMembershipResolver groupMembershipResolver,
+            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver) throws MailboxException {
+        this(mapperFactory, index, dispatcher, locker,  mailbox, AdvancedFeature.None, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver);
     }
 
     public OpenJPAMessageManager(MailboxSessionMapperFactory<JPAId> mapperFactory, 
     		MessageSearchIndex<JPAId> index, MailboxEventDispatcher<JPAId> dispatcher, 
     		MailboxPathLocker locker, Mailbox<JPAId> mailbox, final AdvancedFeature f, 
-    		MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver) throws MailboxException {
+    		MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver,
+            QuotaManager quotaManager, QuotaRootResolver quotaRootResolver) throws MailboxException {
     	
-        super(mapperFactory,  index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver);
+        super(mapperFactory,  index, dispatcher, locker, mailbox, aclResolver, groupMembershipResolver, quotaManager, quotaRootResolver);
         this.feature = f;
     }
 

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java Tue Sep 22 10:23:04 2015
@@ -49,10 +49,16 @@ import org.apache.james.mailbox.model.Ma
 import org.apache.james.mailbox.model.MailboxQuery;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.SimpleMailboxACL;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
+import org.apache.james.mailbox.store.quota.NoQuotaManager;
+import org.apache.james.mailbox.store.quota.QuotaUpdater;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
@@ -96,6 +102,12 @@ public class StoreMailboxManager<Id exte
 
     private MailboxSessionIdGenerator idGenerator;
 
+    private QuotaManager quotaManager;
+
+    private QuotaRootResolver quotaRootResolver;
+
+    private QuotaUpdater quotaUpdater;
+
     private int fetchBatchSize = DEFAULT_FETCH_BATCH_SIZE;
 
 
@@ -115,6 +127,18 @@ public class StoreMailboxManager<Id exte
         this.idGenerator = idGenerator;
     }
 
+    public void setQuotaManager(QuotaManager quotaManager) {
+        this.quotaManager = quotaManager;
+    }
+
+    public void setQuotaRootResolver(QuotaRootResolver quotaRootResolver) {
+        this.quotaRootResolver = quotaRootResolver;
+    }
+
+    public void setQuotaUpdater(QuotaUpdater quotaUpdater) {
+        this.quotaUpdater = quotaUpdater;
+    }
+
     public void setCopyBatchSize(int copyBatchSize) {
         this.copyBatchSize = copyBatchSize;
     }
@@ -142,12 +166,21 @@ public class StoreMailboxManager<Id exte
             index = new SimpleMessageSearchIndex<Id>(mailboxSessionMapperFactory);
         }
         if (index instanceof ListeningMessageSearchIndex) {
-            addGlobalListener((ListeningMessageSearchIndex) index, null);
+            this.addGlobalListener((ListeningMessageSearchIndex) index, null);
         }
 
         if (idGenerator == null) {
             idGenerator = new RandomMailboxSessionIdGenerator();
         }
+        if (quotaManager == null) {
+            quotaManager = new NoQuotaManager();
+        }
+        if (quotaRootResolver == null) {
+            quotaRootResolver = new DefaultQuotaRootResolver(mailboxSessionMapperFactory);
+        }
+        if (quotaUpdater != null && quotaUpdater instanceof MailboxListener) {
+            this.addGlobalListener((MailboxListener) quotaUpdater, null);
+        }
     }
 
     /**
@@ -172,6 +205,13 @@ public class StoreMailboxManager<Id exte
         return index;
     }
 
+    public QuotaRootResolver getQuotaRootResolver() {
+        return quotaRootResolver;
+    }
+
+    public QuotaManager getQuotaManager() {
+        return quotaManager;
+    }
 
     /**
      * Return the {@link MailboxEventDispatcher} used by thei {@link MailboxManager}
@@ -301,7 +341,7 @@ public class StoreMailboxManager<Id exte
      * @return storeMailbox
      */
     protected StoreMessageManager<Id> createMessageManager(Mailbox<Id> mailbox, MailboxSession session) throws MailboxException {
-        return new StoreMessageManager<Id>(getMapperFactory(), getMessageSearchIndex(), getEventDispatcher(), getLocker(), mailbox, getAclResolver(), getGroupMembershipResolver());
+        return new StoreMessageManager<Id>(getMapperFactory(), getMessageSearchIndex(), getEventDispatcher(), getLocker(), mailbox, getAclResolver(), getGroupMembershipResolver(), getQuotaManager(), getQuotaRootResolver());
     }
 
     /**

Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java Tue Sep 22 10:23:04 2015
@@ -58,6 +58,8 @@ import org.apache.james.mailbox.model.Me
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.SimpleMailboxACL;
 import org.apache.james.mailbox.model.UpdatedFlags;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
@@ -66,6 +68,7 @@ import org.apache.james.mailbox.store.ma
 import org.apache.james.mailbox.store.mail.model.Message;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMessage;
+import org.apache.james.mailbox.store.quota.QuotaChecker;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.streaming.BodyOffsetInputStream;
 import org.apache.james.mailbox.store.streaming.CountingInputStream;
@@ -120,12 +123,16 @@ public class StoreMessageManager<Id exte
 
     private final GroupMembershipResolver groupMembershipResolver;
 
+    private final QuotaManager quotaManager;
+
+    private final QuotaRootResolver quotaRootResolver;
+
     private MailboxPathLocker locker;
 
     private int fetchBatchSize;
 
     public StoreMessageManager(final MessageMapperFactory<Id> mapperFactory, final MessageSearchIndex<Id> index, final MailboxEventDispatcher<Id> dispatcher, final MailboxPathLocker locker, final Mailbox<Id> mailbox, final MailboxACLResolver aclResolver,
-            final GroupMembershipResolver groupMembershipResolver) throws MailboxException {
+            final GroupMembershipResolver groupMembershipResolver, final QuotaManager quotaManager, final QuotaRootResolver quotaRootResolver) throws MailboxException {
         this.mailbox = mailbox;
         this.dispatcher = dispatcher;
         this.mapperFactory = mapperFactory;
@@ -133,6 +140,8 @@ public class StoreMessageManager<Id exte
         this.locker = locker;
         this.aclResolver = aclResolver;
         this.groupMembershipResolver = groupMembershipResolver;
+        this.quotaManager = quotaManager;
+        this.quotaRootResolver = quotaRootResolver;
     }
 
     public void setFetchBatchSize(int fetchBatchSize) {
@@ -362,6 +371,9 @@ public class StoreMessageManager<Id exte
             final int size = (int) file.length();
 
             final Message<Id> message = createMessage(internalDate, size, bodyStartOctet, contentIn, flags, propertyBuilder);
+
+            new QuotaChecker(quotaManager, quotaRootResolver, mailbox).tryAddition(1, size);
+
             return locker.executeWithLock(mailboxSession, new StoreMailboxPath<Id>(getMailboxEntity()), new MailboxPathLocker.LockAwareExecution<Long>() {
 
                 @Override
@@ -688,9 +700,11 @@ public class StoreMessageManager<Id exte
     private Iterator<MessageMetaData> copy(final Iterator<Message<Id>> originalRows, final MailboxSession session) throws MailboxException {
         final List<MessageMetaData> copiedRows = new ArrayList<MessageMetaData>();
         final MessageMapper<Id> messageMapper = mapperFactory.getMessageMapper(session);
+        QuotaChecker quotaChecker = new QuotaChecker(quotaManager, quotaRootResolver, mailbox);
 
         while (originalRows.hasNext()) {
             final Message<Id> originalMessage = originalRows.next();
+            quotaChecker.tryAddition(1, originalMessage.getFullContentOctets());
             MessageMetaData data = messageMapper.execute(new Mapper.Transaction<MessageMetaData>() {
                 public MessageMetaData run() throws MailboxException {
                     return messageMapper.copy(getMailboxEntity(), originalMessage);
@@ -802,4 +816,5 @@ public class StoreMessageManager<Id exte
     protected MailboxACL getResolvedMailboxACL(MailboxSession mailboxSession) throws UnsupportedRightException {
         return aclResolver.applyGlobalACL(mailbox.getACL(), new GroupFolderResolver(mailboxSession).isGroupFolder(mailbox));
     }
+
 }

Added: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java?rev=1704537&view=auto
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java (added)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java Tue Sep 22 10:23:04 2015
@@ -0,0 +1,59 @@
+/****************************************************************
+ * 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.store.quota;
+
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.OverQuotaException;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+
+public class QuotaChecker {
+
+    private Quota messageQuota;
+    private Quota sizeQuota;
+    private QuotaRoot quotaRoot;
+
+    public QuotaChecker(QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, Mailbox mailbox) throws MailboxException {
+        this.quotaRoot = quotaRootResolver.getQuotaRoot(new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()));
+        this.messageQuota = quotaManager.getMessageQuota(quotaRoot);
+        this.sizeQuota = quotaManager.getStorageQuota(quotaRoot);
+    }
+
+    public boolean tryAddition(long count, long size) throws OverQuotaException {
+        messageQuota.addValueToQuota(count);
+        sizeQuota.addValueToQuota(size);
+        return check();
+    }
+
+    private boolean check() throws OverQuotaException {
+        if (messageQuota.isOverQuota() ) {
+            throw new OverQuotaException("You have too many messages in " + quotaRoot.getValue(), messageQuota.getMax(), messageQuota.getUsed());
+        }
+        if (sizeQuota.isOverQuota()) {
+            throw new OverQuotaException("You use too much space in " + quotaRoot.getValue(), sizeQuota.getMax(), sizeQuota.getUsed());
+        }
+        return true;
+    }
+
+}

Added: james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java?rev=1704537&view=auto
==============================================================================
--- james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java (added)
+++ james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java Tue Sep 22 10:23:04 2015
@@ -0,0 +1,189 @@
+/****************************************************************
+ * 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.store.quota;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import static org.assertj.core.api.Assertions.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.OverQuotaException;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
+import org.apache.james.mailbox.store.TestId;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class QuotaCheckerTest {
+
+    public static final QuotaRoot QUOTA_ROOT = QuotaRootImpl.quotaRoot("benwa");
+    public static final MailboxPath MAILBOX_PATH = new MailboxPath("#private", "benwa", "INBOX");
+    public static final SimpleMailbox<TestId> MAILBOX = new SimpleMailbox<TestId>(MAILBOX_PATH, 10);
+
+    private QuotaRootResolver mockedQuotaRootResolver;
+    private QuotaManager mockedQuotaManager;
+
+    @Before
+    public void setUp() {
+        mockedQuotaManager = mock(QuotaManager.class);
+        mockedQuotaRootResolver = mock(QuotaRootResolver.class);
+    }
+
+    @Test
+    public void quotaCheckerShouldNotThrowOnRegularQuotas() throws MailboxException {
+        when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenAnswer(new Answer<QuotaRoot>() {
+            @Override
+            public QuotaRoot answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QUOTA_ROOT;
+            }
+        });
+        when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+            @Override
+            public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QuotaImpl.quota(10, 100);
+            }
+        });
+        when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+            @Override
+            public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QuotaImpl.quota(100, 1000);
+            }
+        });
+        QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
+        assertThat(quotaChecker.tryAddition(0, 0)).isTrue();
+    }
+
+    @Test
+    public void quotaCheckerShouldNotThrowOnRegularModifiedQuotas() throws MailboxException {
+        when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenAnswer(new Answer<QuotaRoot>() {
+            @Override
+            public QuotaRoot answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QUOTA_ROOT;
+            }
+        });
+        when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+            @Override
+            public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QuotaImpl.quota(10, 100);
+            }
+        });
+        when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+            @Override
+            public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QuotaImpl.quota(100, 1000);
+            }
+        });
+        QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
+        assertThat(quotaChecker.tryAddition(89, 899)).isTrue();
+    }
+
+    @Test
+    public void quotaCheckerShouldNotThrowOnReachedMaximumQuotas() throws MailboxException {
+        when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenAnswer(new Answer<QuotaRoot>() {
+            @Override
+            public QuotaRoot answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QUOTA_ROOT;
+            }
+        });
+        when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+            @Override
+            public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QuotaImpl.quota(10, 100);
+            }
+        });
+        when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+            @Override
+            public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                return QuotaImpl.quota(100, 1000);
+            }
+        });
+        QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
+        assertThat(quotaChecker.tryAddition(90, 900)).isTrue();
+    }
+
+    @Test(expected = OverQuotaException.class)
+    public void quotaCheckerShouldThrowOnExceededMessages() throws MailboxException {
+        QuotaChecker quotaChecker;
+        try {
+            when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenAnswer(new Answer<QuotaRoot>() {
+                @Override
+                public QuotaRoot answer(InvocationOnMock invocationOnMock) throws Throwable {
+                    return QUOTA_ROOT;
+                }
+            });
+            when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+                @Override
+                public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                    return QuotaImpl.quota(10, 100);
+                }
+            });
+            when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+                @Override
+                public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                    return QuotaImpl.quota(100, 1000);
+                }
+            });
+            quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
+        } catch(Exception e) {
+            fail("Exception caught : ", e);
+            return;
+        }
+        quotaChecker.tryAddition(91, 899);
+    }
+
+    @Test(expected = OverQuotaException.class)
+    public void quotaCheckerShouldThrowOnExceededStorage() throws MailboxException {
+        QuotaChecker quotaChecker;
+        try {
+            when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenAnswer(new Answer<QuotaRoot>() {
+                @Override
+                public QuotaRoot answer(InvocationOnMock invocationOnMock) throws Throwable {
+                    return QUOTA_ROOT;
+                }
+            });
+            when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+                @Override
+                public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                    return QuotaImpl.quota(10, 100);
+                }
+            });
+            when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenAnswer(new Answer<Quota>() {
+                @Override
+                public Quota answer(InvocationOnMock invocationOnMock) throws Throwable {
+                    return QuotaImpl.quota(100, 1000);
+                }
+            });
+            quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
+        } catch(Exception e) {
+            fail("Exception caught : ", e);
+            return;
+        }
+        quotaChecker.tryAddition(89, 901);
+    }
+
+}

Modified: james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java?rev=1704537&r1=1704536&r2=1704537&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java (original)
+++ james/mailbox/trunk/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java Tue Sep 22 10:23:04 2015
@@ -53,7 +53,7 @@ public class StoreQuotaManagerTest {
     }
 
     @Test
-    public void test() throws Exception {
+    public void getMessageQuotaShouldWorkWithNumericValues() throws Exception {
         when(mockedMaxQuotaManager.getMaxMessage(quotaRoot)).then(new Answer<Long>() {
             @Override
             public Long answer(InvocationOnMock invocationOnMock) throws Throwable {
@@ -70,7 +70,7 @@ public class StoreQuotaManagerTest {
     }
 
     @Test
-    public void test2() throws Exception {
+    public void getStorageQuotaShouldWorkWithNumericValues() throws Exception {
         when(mockedMaxQuotaManager.getMaxStorage(quotaRoot)).then(new Answer<Long>() {
             @Override
             public Long answer(InvocationOnMock invocationOnMock) throws Throwable {
@@ -87,7 +87,7 @@ public class StoreQuotaManagerTest {
     }
 
     @Test
-    public void test3() throws Exception {
+    public void getStorageQuotaShouldNotCalculateCurrentQuotaWhenUnlimited() throws Exception {
         testee.setCalculateWhenUnlimited(false);
         when(mockedMaxQuotaManager.getMaxStorage(quotaRoot)).then(new Answer<Long>() {
             @Override
@@ -100,7 +100,7 @@ public class StoreQuotaManagerTest {
     }
 
     @Test
-    public void test4() throws Exception {
+    public void getMessageQuotaShouldNotCalculateCurrentQuotaWhenUnlimited() throws Exception {
         testee.setCalculateWhenUnlimited(false);
         when(mockedMaxQuotaManager.getMaxMessage(quotaRoot)).then(new Answer<Long>() {
             @Override
@@ -113,7 +113,7 @@ public class StoreQuotaManagerTest {
     }
 
     @Test
-    public void test5() throws Exception {
+    public void getStorageQuotaShouldCalculateCurrentQuotaWhenUnlimited() throws Exception {
         testee.setCalculateWhenUnlimited(true);
         when(mockedMaxQuotaManager.getMaxStorage(quotaRoot)).then(new Answer<Long>() {
             @Override
@@ -131,7 +131,7 @@ public class StoreQuotaManagerTest {
     }
 
     @Test
-    public void test6() throws Exception {
+    public void getMessageQuotaShouldCalculateCurrentQuotaWhenUnlimited() throws Exception {
         testee.setCalculateWhenUnlimited(true);
         when(mockedMaxQuotaManager.getMaxMessage(quotaRoot)).then(new Answer<Long>() {
             @Override




---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org