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 no...@apache.org on 2011/06/09 20:49:19 UTC
svn commit: r1134034 - in /james/mailbox/trunk:
api/src/main/java/org/apache/james/mailbox/quota/
store/src/main/java/org/apache/james/mailbox/store/
store/src/main/java/org/apache/james/mailbox/store/mail/
store/src/main/java/org/apache/james/mailbox/...
Author: norman
Date: Thu Jun 9 18:49:19 2011
New Revision: 1134034
URL: http://svn.apache.org/viewvc?rev=1134034&view=rev
Log:
Get ready for supporting Quotas. See MAILBOX-64
Added:
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/Quota.java
james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/FixedQuotaManager.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningQuotaManager.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/PerUserQuotaManager.java
james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaImpl.java
Modified:
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/mail/MessageMapper.java
Added: james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/Quota.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/Quota.java?rev=1134034&view=auto
==============================================================================
--- james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/Quota.java (added)
+++ james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/Quota.java Thu Jun 9 18:49:19 2011
@@ -0,0 +1,54 @@
+/****************************************************************
+ * 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.quota;
+
+/**
+ * A {@link Quota} restriction
+ *
+ *
+ *
+ */
+public interface Quota {
+
+ /**
+ * Unlimited value
+ */
+ public final static long UNLIMITED = -1;
+
+
+ /**
+ * Value not known
+ */
+ public final static long UNKNOWN = Long.MIN_VALUE;
+
+ /**
+ * Return the maximum value for the {@link Quota}
+ *
+ * @return max
+ */
+ long getMax();
+
+ /**
+ * Return the currently used for the {@link Quota}
+ *
+ * @return used
+ */
+ long getUsed();
+
+}
Added: james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java?rev=1134034&view=auto
==============================================================================
--- james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java (added)
+++ james/mailbox/trunk/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java Thu Jun 9 18:49:19 2011
@@ -0,0 +1,54 @@
+/****************************************************************
+ * 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.quota;
+
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
+
+
+/**
+ * Allows to get quotas for {@link MailboxSession} which are bound to a user.
+ *
+ *
+ * @param <Id>
+ */
+public interface QuotaManager {
+
+ /**
+ * Return the message count {@link Quota} for the given {@link MailboxSession} (which in fact is
+ * bound to a user)
+ *
+ * @param session
+ * @return quota
+ * @throws MailboxException
+ */
+ public Quota getMessageQuota(MailboxSession session) throws MailboxException;
+
+
+ /**
+ * Return the message storage {@link Quota} for the given {@link MailboxSession} (which in fact is
+ * bound to a user)
+ *
+ * @param session
+ * @return quota
+ * @throws MailboxException
+ */
+ public Quota getStorageQuota(MailboxSession session) throws MailboxException;
+
+}
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=1134034&r1=1134033&r2=1134034&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 Thu Jun 9 18:49:19 2011
@@ -52,7 +52,6 @@ import org.apache.james.mailbox.store.tr
import org.apache.james.mailbox.store.transaction.TransactionalMapper;
import org.apache.james.mailbox.util.SimpleMailboxMetaData;
import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* This abstract base class of an {@link MailboxManager} implementation provides a high-level api for writing your own
@@ -74,7 +73,6 @@ public abstract class StoreMailboxManage
private final Authenticator authenticator;
private final static Random RANDOM = new Random();
- private Logger log = LoggerFactory.getLogger("org.apache.james.mailbox");
private MailboxPathLocker locker;
@@ -105,22 +103,22 @@ public abstract class StoreMailboxManage
}
}
- protected AbstractDelegatingMailboxListener getDelegationListener() {
+ public AbstractDelegatingMailboxListener getDelegationListener() {
if (delegatingListener == null) {
delegatingListener = new HashMapDelegatingMailboxListener();
}
return delegatingListener;
}
- protected MessageSearchIndex<Id> getMessageSearchIndex() {
+ public MessageSearchIndex<Id> getMessageSearchIndex() {
return index;
}
- protected MailboxEventDispatcher<Id> getEventDispatcher() {
+ public MailboxEventDispatcher<Id> getEventDispatcher() {
return dispatcher;
}
- protected MailboxSessionMapperFactory<Id> getMapperFactory() {
+ public MailboxSessionMapperFactory<Id> getMapperFactory() {
return mailboxSessionMapperFactory;
}
@@ -141,14 +139,6 @@ public abstract class StoreMailboxManage
public void setMessageSearchIndex(MessageSearchIndex<Id> index) {
this.index = index;
}
-
- protected Logger getLog() {
- return log;
- }
-
- public void setLog(Logger log) {
- this.log = log;
- }
/**
* Generate an return the next uid validity
@@ -253,11 +243,11 @@ public abstract class StoreMailboxManage
Mailbox<Id> mailboxRow = mapper.findMailboxByPath(mailboxPath);
if (mailboxRow == null) {
- getLog().info("Mailbox '" + mailboxPath + "' not found.");
+ session.getLog().info("Mailbox '" + mailboxPath + "' not found.");
throw new MailboxNotFoundException(mailboxPath);
} else {
- getLog().debug("Loaded mailbox " + mailboxPath);
+ session.getLog().debug("Loaded mailbox " + mailboxPath);
StoreMessageManager<Id> m = createMessageManager(mailboxRow, session);
return m;
@@ -272,10 +262,10 @@ public abstract class StoreMailboxManage
*/
public void createMailbox(MailboxPath mailboxPath, final MailboxSession mailboxSession)
throws MailboxException {
- getLog().debug("createMailbox " + mailboxPath);
+ mailboxSession.getLog().debug("createMailbox " + mailboxPath);
final int length = mailboxPath.getName().length();
if (length == 0) {
- getLog().warn("Ignoring mailbox with empty name");
+ mailboxSession.getLog().warn("Ignoring mailbox with empty name");
} else {
if (mailboxPath.getName().charAt(length - 1) == getDelimiter())
mailboxPath.setName(mailboxPath.getName().substring(0, length - 1));
@@ -339,7 +329,7 @@ public abstract class StoreMailboxManage
* @see org.apache.james.mailbox.MailboxManager#renameMailbox(org.apache.james.imap.api.MailboxPath, org.apache.james.imap.api.MailboxPath, org.apache.james.mailbox.MailboxSession)
*/
public void renameMailbox(final MailboxPath from, final MailboxPath to, final MailboxSession session) throws MailboxException {
- final Logger log = getLog();
+ final Logger log = session.getLog();
if (log.isDebugEnabled())
log.debug("renameMailbox " + from + " to " + to);
if (mailboxExists(to, session)) {
Modified: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java?rev=1134034&r1=1134033&r2=1134034&view=diff
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java (original)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java Thu Jun 9 18:49:19 2011
@@ -27,7 +27,6 @@ import javax.mail.Flags;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MessageMetaData;
import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.SearchQuery;
import org.apache.james.mailbox.UpdatedFlags;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.Message;
Added: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/FixedQuotaManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/FixedQuotaManager.java?rev=1134034&view=auto
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/FixedQuotaManager.java (added)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/FixedQuotaManager.java Thu Jun 9 18:49:19 2011
@@ -0,0 +1,62 @@
+/****************************************************************
+ * 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.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.quota.Quota;
+import org.apache.james.mailbox.store.StoreMailboxManager;
+
+/**
+ * {@link ListeningQuotaManager} which use the same quota for all users.
+ *
+ * By default this means not quota at all
+ *
+ *
+ * @param <Id>
+ */
+public class FixedQuotaManager extends ListeningQuotaManager{
+
+ @SuppressWarnings("rawtypes")
+ public FixedQuotaManager(StoreMailboxManager manager) throws MailboxException {
+ super(manager);
+ }
+
+ private long maxStorage = Quota.UNLIMITED;
+ private long maxMessage = Quota.UNLIMITED;
+
+ public void setMaxStorage(long maxStorage) {
+ this.maxStorage = maxStorage;
+ }
+
+ public void setMaxMessage(long maxMessage) {
+ this.maxMessage = maxMessage;
+ }
+
+ @Override
+ protected long getMaxStorage(MailboxSession session) throws MailboxException {
+ return maxStorage;
+ }
+
+ @Override
+ protected long getMaxMessage(MailboxSession session) throws MailboxException {
+ return maxMessage;
+ }
+
+}
Added: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningQuotaManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningQuotaManager.java?rev=1134034&view=auto
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningQuotaManager.java (added)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningQuotaManager.java Thu Jun 9 18:49:19 2011
@@ -0,0 +1,237 @@
+/****************************************************************
+ * 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 java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxListener;
+import org.apache.james.mailbox.MailboxPath;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.quota.Quota;
+import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.Message;
+import org.apache.james.mailbox.store.transaction.Mapper.MailboxMembershipCallback;
+
+/**
+ * {@link QuotaManager} which will keep track of quota by listing for {@link Event}'s.
+ *
+ * The whole quota is keeped in memory after it was lazy-fetched on the first access
+ * *
+ */
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public abstract class ListeningQuotaManager implements QuotaManager, MailboxListener{
+
+ private MailboxSessionMapperFactory factory;
+ private ConcurrentHashMap<String, AtomicLong> counts = new ConcurrentHashMap<String, AtomicLong>();
+ private ConcurrentHashMap<String, AtomicLong> sizes = new ConcurrentHashMap<String, AtomicLong>();
+ private boolean calculateWhenUnlimited = false;
+
+ public ListeningQuotaManager(StoreMailboxManager<?> manager) throws MailboxException {
+ this.factory = manager.getMapperFactory();
+ manager.addGlobalListener(this, null);
+ }
+
+ protected MailboxSessionMapperFactory<?> getFactory() {
+ return factory;
+ }
+
+ public void setCalculateUsedWhenUnlimited(boolean calculateWhenUnlimited) {
+ this.calculateWhenUnlimited = calculateWhenUnlimited;
+ }
+
+
+ @Override
+ public Quota getMessageQuota(MailboxSession session) throws MailboxException {
+ long max = getMaxMessage(session);
+ if (max != Quota.UNLIMITED || calculateWhenUnlimited) {
+
+ String id = session.getUser().getUserName();
+ AtomicLong count = counts.get(id);
+ if (count == null) {
+ long mc = 0;
+ List<Mailbox> mailboxes = factory.getMailboxMapper(session).findMailboxWithPathLike(new MailboxPath(session.getPersonalSpace(), id, "%"));
+ for (int i = 0; i < mailboxes.size(); i++) {
+ mc += factory.getMessageMapper(session).countMessagesInMailbox(mailboxes.get(i));
+ }
+ AtomicLong c = counts.putIfAbsent(id, new AtomicLong(mc));
+ if (c != null) {
+ count = c;
+ }
+ }
+ return QuotaImpl.quota(max, count.get());
+ } else {
+ return QuotaImpl.unlimited();
+ }
+ }
+
+ @Override
+ public Quota getStorageQuota(MailboxSession session) throws MailboxException {
+ long max = getMaxStorage(session);
+ if (max != Quota.UNLIMITED || calculateWhenUnlimited) {
+ String id = session.getUser().getUserName();
+ AtomicLong size = sizes.get(id);
+ if (size == null) {
+ final AtomicLong mSizes = new AtomicLong(0);
+ List<Mailbox> mailboxes = factory.getMailboxMapper(session).findMailboxWithPathLike(new MailboxPath(session.getPersonalSpace(), id, "%"));
+ for (int i = 0; i < mailboxes.size(); i++) {
+ factory.getMessageMapper(session).findInMailbox(mailboxes.get(i), MessageRange.all(), new MailboxMembershipCallback<Object>() {
+ long messageSizes = 0;
+
+ @Override
+ public void onMailboxMembers(List<Message<Object>> list) throws MailboxException {
+ for (int i = 0; i < list.size(); i++) {
+ messageSizes += list.get(i).getFullContentOctets();
+ }
+ mSizes.set(mSizes.get() + messageSizes);
+ }
+ });
+ }
+
+
+
+ AtomicLong s = sizes.putIfAbsent(id, mSizes);
+ if (s != null) {
+ size = s;
+ } else {
+ size = mSizes;
+ }
+ }
+ return QuotaImpl.quota(max, size.get());
+ } else {
+ return QuotaImpl.unlimited();
+ }
+ }
+
+ /**
+ * Return the maximum storage which is allowed for the given {@link MailboxSession} (in fact the user which the session is bound to)
+ *
+ * The returned valued must be in <strong>bytes</strong>
+ *
+ * @param session
+ * @param mailbox
+ * @return maxBytes
+ * @throws MailboxException
+ */
+ protected abstract long getMaxStorage(MailboxSession session) throws MailboxException;
+
+
+ /**
+ * Return the maximum message count which is allowed for the given {@link MailboxSession} (in fact the user which the session is bound to)
+ *
+ * @param session
+ * @param mailbox
+ * @return
+ * @throws MailboxException
+ */
+ protected abstract long getMaxMessage(MailboxSession session) throws MailboxException;
+
+
+ @Override
+ public void event(Event event) {
+ String id = event.getSession().getUser().getUserName();
+ if (event instanceof Added) {
+ Added added = (Added) event;
+
+ long s = 0;
+ long c = 0;
+ Iterator<Long> uids = added.getUids().iterator();;
+ while(uids.hasNext()) {
+ long uid = uids.next();
+ s += added.getMetaData(uid).getSize();
+ c++;
+ }
+
+ AtomicLong size = sizes.get(id);
+ if (size != null) {
+ while(true) {
+ long expected = size.get();
+ long newValue = expected + s;
+ if (size.compareAndSet(expected, newValue)) {
+ break;
+ }
+ }
+ }
+
+ AtomicLong count = counts.get(id);
+ if (count != null) {
+ while(true) {
+ long expected = count.get();
+ long newValue = expected + c;
+ if (count.compareAndSet(expected, newValue)) {
+ break;
+ }
+ }
+ }
+ } else if (event instanceof Expunged) {
+ Expunged expunged = (Expunged) event;
+ long s = 0;
+ long c = 0;
+ Iterator<Long> uids = expunged.getUids().iterator();;
+ while(uids.hasNext()) {
+ long uid = uids.next();
+ s += expunged.getMetaData(uid).getSize();
+ c++;
+ }
+
+ AtomicLong size = sizes.get(id);
+ if (size != null) {
+ while(true) {
+ long expected = size.get();
+ long newValue = expected - s;
+ if (size.compareAndSet(expected, newValue)) {
+ break;
+ }
+ }
+ }
+
+ AtomicLong count = counts.get(id);
+ if (count != null) {
+ while(true) {
+ long expected = count.get();
+ long newValue = expected - c;
+ if (count.compareAndSet(expected, newValue)) {
+ break;
+ }
+ }
+ }
+ } else if (event instanceof MailboxAdded) {
+ counts.putIfAbsent(id, new AtomicLong(0));
+ sizes.putIfAbsent(id, new AtomicLong(0));
+ }
+ }
+
+ /**
+ * Get never closed
+ *
+ * @return false
+ */
+ public boolean isClosed() {
+ return false;
+ }
+
+
+}
Added: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/PerUserQuotaManager.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/PerUserQuotaManager.java?rev=1134034&view=auto
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/PerUserQuotaManager.java (added)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/PerUserQuotaManager.java Thu Jun 9 18:49:19 2011
@@ -0,0 +1,80 @@
+/****************************************************************
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.quota.Quota;
+import org.apache.james.mailbox.store.StoreMailboxManager;
+
+/**
+ * Allows to set a per Users quota
+ *
+ *
+ */
+public class PerUserQuotaManager<Id> extends ListeningQuotaManager{
+
+ public PerUserQuotaManager(StoreMailboxManager<Id> manager) throws MailboxException {
+ super(manager);
+ }
+
+ private long maxMessage = Quota.UNLIMITED;
+ private long maxStorage = Quota.UNLIMITED;
+
+ private Map<String, Long> userMaxStorage = new HashMap<String, Long>();
+ private Map<String, Long> userMaxMessage = new HashMap<String, Long>();
+
+ public void setUserMaxStorage(Map<String, Long> userMaxStorage) {
+ this.userMaxStorage = userMaxStorage;
+ }
+
+ public void setUserMaxMessage(Map<String, Long> userMaxMessage) {
+ this.userMaxMessage = userMaxMessage;
+ }
+
+ public void setDefaultMaxStorage(long maxStorage) {
+ this.maxStorage = maxStorage;
+ }
+
+ public void setDefaultMaxMessage(long maxMessage) {
+ this.maxMessage = maxMessage;
+ }
+
+ @Override
+ protected long getMaxStorage(MailboxSession session) throws MailboxException {
+ Long max = userMaxStorage.get(session.getUser().getUserName());
+ if (max == null) {
+ max = maxStorage;
+ }
+ return max;
+ }
+
+ @Override
+ protected long getMaxMessage(MailboxSession session) throws MailboxException {
+ Long max = userMaxMessage.get(session.getUser().getUserName());
+ if (max == null) {
+ max = maxMessage;
+ }
+ return max;
+ }
+
+}
Added: james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaImpl.java
URL: http://svn.apache.org/viewvc/james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaImpl.java?rev=1134034&view=auto
==============================================================================
--- james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaImpl.java (added)
+++ james/mailbox/trunk/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaImpl.java Thu Jun 9 18:49:19 2011
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.quota.Quota;
+
+public final class QuotaImpl implements Quota{
+
+ private long max;
+ private long used;
+
+ private final static Quota UNLIMITED_QUOTA = new QuotaImpl(UNKNOWN, UNLIMITED);
+
+ private QuotaImpl(long used, long max) {
+
+ }
+
+ @Override
+ public long getMax() {
+ return max;
+ }
+
+ @Override
+ public long getUsed() {
+ return used;
+ }
+
+ /**
+ * Return a {@link Quota} which in fact is unlimited
+ *
+ * @return unlimited
+ */
+ public static Quota unlimited() {
+ return UNLIMITED_QUOTA;
+ }
+
+ /**
+ * Return a {@link Quota} for the given values
+ *
+ * @param max
+ * @param used
+ * @return quota
+ */
+ public static Quota quota(long max , long used) {
+ return new QuotaImpl(used, max);
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org