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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to