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