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 2010/04/15 12:14:55 UTC
svn commit: r934354 - in /james/imap/trunk:
jcr/src/main/java/org/apache/james/imap/jcr/
jpa/src/main/java/org/apache/james/imap/jpa/
memory/src/main/java/org/apache/james/imap/inmemory/
store/src/main/java/org/apache/james/imap/store/
Author: norman
Date: Thu Apr 15 10:14:55 2010
New Revision: 934354
URL: http://svn.apache.org/viewvc?rev=934354&view=rev
Log:
Revert changes from yesterday. After thinkin a bit more about it I think the fix needs to be a bit different
Modified:
james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java (contents, props changed)
Modified: james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java?rev=934354&r1=934353&r2=934354&view=diff
==============================================================================
--- james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java (original)
+++ james/imap/trunk/jcr/src/main/java/org/apache/james/imap/jcr/JCRGlobalUserMailboxManager.java Thu Apr 15 10:14:55 2010
@@ -70,6 +70,7 @@ public class JCRGlobalUserMailboxManager
public void run() throws MailboxException {
mapper.deleteAll();
+ mailboxes.clear();
}
});
Modified: james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java?rev=934354&r1=934353&r2=934354&view=diff
==============================================================================
--- james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java (original)
+++ james/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java Thu Apr 15 10:14:55 2010
@@ -75,6 +75,7 @@ public abstract class JPAMailboxManager
public void run() throws MailboxException {
mapper.deleteAll();
+ mailboxes.clear();
}
});
Modified: james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java?rev=934354&r1=934353&r2=934354&view=diff
==============================================================================
--- james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java (original)
+++ james/imap/trunk/memory/src/main/java/org/apache/james/imap/inmemory/InMemoryMailboxManager.java Thu Apr 15 10:14:55 2010
@@ -176,6 +176,7 @@ public class InMemoryMailboxManager exte
public void run() throws MailboxException {
mapper.deleteAll();
+ mailboxes.clear();
}
});
Modified: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java?rev=934354&r1=934353&r2=934354&view=diff
==============================================================================
--- james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java (original)
+++ james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java Thu Apr 15 10:14:55 2010
@@ -22,8 +22,10 @@ package org.apache.james.imap.store;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.Random;
import org.apache.commons.logging.Log;
@@ -55,6 +57,8 @@ public abstract class StoreMailboxManage
private final static Random random = new Random();
+ protected final Map<String, StoreMailbox<Id>> mailboxes;
+
private final Authenticator authenticator;
private final Subscriber subscriber;
@@ -68,6 +72,7 @@ public abstract class StoreMailboxManage
public StoreMailboxManager(final Authenticator authenticator, final Subscriber subscriber, final char delimiter) {
+ mailboxes = new HashMap<String, StoreMailbox<Id>>();
this.authenticator = authenticator;
this.subscriber = subscriber;
this.delimiter = delimiter;
@@ -114,19 +119,27 @@ public abstract class StoreMailboxManage
* @throws MailboxException get thrown if no Mailbox could be found for the given name
*/
private StoreMailbox<Id> doGetMailbox(String mailboxName, MailboxSession session) throws MailboxException {
- final MailboxMapper<Id> mapper = createMailboxMapper(session);
- Mailbox<Id> mailboxRow = mapper.findMailboxByName(mailboxName);
-
- if (mailboxRow == null) {
- getLog().info("Mailbox '" + mailboxName + "' not found.");
- throw new MailboxNotFoundException(mailboxName);
+ synchronized (mailboxes) {
+ final MailboxMapper<Id> mapper = createMailboxMapper(session);
+ Mailbox<Id> mailboxRow = mapper.findMailboxByName(mailboxName);
+
+ if (mailboxRow == null) {
+ getLog().info("Mailbox '" + mailboxName + "' not found.");
+ throw new MailboxNotFoundException(mailboxName);
- } else {
- getLog().debug("Loaded mailbox " + mailboxName);
-
- StoreMailbox<Id> result = createMailbox(mailboxRow, session);
- return result;
+ } else {
+ getLog().debug("Loaded mailbox " + mailboxName);
+ StoreMailbox<Id> result = (StoreMailbox<Id>) mailboxes.get(mailboxName);
+ if (result == null) {
+ result = createMailbox(mailboxRow, session);
+ mailboxes.put(mailboxName, result);
+
+ // store the mailbox in the session so we can cleanup things later
+ //session.getAttributes().put(MAILBOX, result);
+ }
+ return result;
+ }
}
}
@@ -134,7 +147,8 @@ public abstract class StoreMailboxManage
* (non-Javadoc)
* @see org.apache.james.imap.mailbox.MailboxManager#createMailbox(java.lang.String, org.apache.james.imap.mailbox.MailboxSession)
*/
- public void createMailbox(String namespaceName, MailboxSession mailboxSession) throws MailboxException {
+ public void createMailbox(String namespaceName, MailboxSession mailboxSession)
+ throws MailboxException {
getLog().debug("createMailbox " + namespaceName);
final int length = namespaceName.length();
if (length == 0) {
@@ -142,54 +156,64 @@ public abstract class StoreMailboxManage
} else if (namespaceName.charAt(length - 1) == delimiter) {
createMailbox(namespaceName.substring(0, length - 1), mailboxSession);
} else {
- // Create root first
- // If any creation fails then mailbox will not be created
- // TODO: transaction
- int index = namespaceName.indexOf(delimiter);
- int count = 0;
- while (index >= 0) {
- // Until explicit namespace support is added,
- // this workaround prevents the namespaced elements being
- // created
- // TODO: add explicit support for namespaces
- if (index > 0 && count++ > 1) {
- final String mailbox = namespaceName.substring(0, index);
- if (!mailboxExists(mailbox, mailboxSession)) {
- doCreate(mailbox, mailboxSession);
+ synchronized (mailboxes) {
+ // Create root first
+ // If any creation fails then mailbox will not be created
+ // TODO: transaction
+ int index = namespaceName.indexOf(delimiter);
+ int count = 0;
+ while (index >= 0) {
+ // Until explicit namespace support is added,
+ // this workaround prevents the namespaced elements being
+ // created
+ // TODO: add explicit support for namespaces
+ if (index > 0 && count++ > 1) {
+ final String mailbox = namespaceName
+ .substring(0, index);
+ if (!mailboxExists(mailbox, mailboxSession)) {
+ doCreate(mailbox, mailboxSession);
+ }
}
+ index = namespaceName.indexOf(delimiter, ++index);
+ }
+ if (mailboxExists(namespaceName, mailboxSession)) {
+ throw new MailboxExistsException(namespaceName);
+ } else {
+ doCreate(namespaceName, mailboxSession);
}
- index = namespaceName.indexOf(delimiter, ++index);
- }
- if (mailboxExists(namespaceName, mailboxSession)) {
- throw new MailboxExistsException(namespaceName);
- } else {
- doCreate(namespaceName, mailboxSession);
}
}
-
}
/*
* (non-Javadoc)
* @see org.apache.james.imap.mailbox.MailboxManager#deleteMailbox(java.lang.String, org.apache.james.imap.mailbox.MailboxSession)
*/
- public void deleteMailbox(final String mailboxName, final MailboxSession session) throws MailboxException {
+ public void deleteMailbox(final String mailboxName, final MailboxSession session)
+ throws MailboxException {
session.getLog().info("deleteMailbox " + mailboxName);
- // TODO put this into a serilizable transaction
- final MailboxMapper<Id> mapper = createMailboxMapper(session);
-
- mapper.execute(new TransactionalMapper.Transaction() {
-
- public void run() throws MailboxException {
- Mailbox<Id> mailbox = mapper.findMailboxByName(mailboxName);
- if (mailbox == null) {
- throw new MailboxNotFoundException("Mailbox not found");
+ synchronized (mailboxes) {
+ // TODO put this into a serilizable transaction
+
+ final MailboxMapper<Id> mapper = createMailboxMapper(session);
+
+ mapper.execute(new TransactionalMapper.Transaction() {
+
+ public void run() throws MailboxException {
+ Mailbox<Id> mailbox = mapper.findMailboxByName(mailboxName);
+ if (mailbox == null) {
+ throw new MailboxNotFoundException("Mailbox not found");
+ }
+ mapper.delete(mailbox);
}
- mapper.delete(mailbox);
+
+ });
+
+ final StoreMailbox<Id> storeMailbox = mailboxes.remove(mailboxName);
+ if (storeMailbox != null) {
+ storeMailbox.deleted(session);
}
-
- });
-
+ }
}
/*
@@ -199,40 +223,44 @@ public abstract class StoreMailboxManage
public void renameMailbox(final String from, final String to, final MailboxSession session)
throws MailboxException {
final Log log = getLog();
- if (log.isDebugEnabled())
- log.debug("renameMailbox " + from + " to " + to);
- if (mailboxExists(to, session)) {
- throw new MailboxExistsException(to);
- }
+ if (log.isDebugEnabled()) log.debug("renameMailbox " + from + " to " + to);
+ synchronized (mailboxes) {
+ if (mailboxExists(to, session)) {
+ throw new MailboxExistsException(to);
+ }
- final MailboxMapper<Id> mapper = createMailboxMapper(session);
- mapper.execute(new TransactionalMapper.Transaction() {
+ final MailboxMapper<Id> mapper = createMailboxMapper(session);
+ mapper.execute(new TransactionalMapper.Transaction() {
- public void run() throws MailboxException {
- // TODO put this into a serilizable transaction
- final Mailbox<Id> mailbox = mapper.findMailboxByName(from);
+ public void run() throws MailboxException {
+ // TODO put this into a serilizable transaction
+ final Mailbox<Id> mailbox = mapper.findMailboxByName(from);
- if (mailbox == null) {
- throw new MailboxNotFoundException(from);
- }
- mailbox.setName(to);
- mapper.save(mailbox);
+ if (mailbox == null) {
+ throw new MailboxNotFoundException(from);
+ }
+ mailbox.setName(to);
+ mapper.save(mailbox);
- // rename submailbox
- final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithNameLike(from + delimiter + "%");
- for (Mailbox<Id> sub : subMailboxes) {
- final String subOriginalName = sub.getName();
- final String subNewName = to + subOriginalName.substring(from.length());
- sub.setName(subNewName);
- mapper.save(sub);
+ changeMailboxName(from, to);
- if (log.isDebugEnabled())
- log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to " + subNewName);
- }
- }
+ // rename submailbox
+ final List<Mailbox<Id>> subMailboxes = mapper.findMailboxWithNameLike(from + delimiter + "%");
+ for (Mailbox<Id> sub:subMailboxes) {
+ final String subOriginalName = sub.getName();
+ final String subNewName = to + subOriginalName.substring(from.length());
+ sub.setName(subNewName);
+ mapper.save(sub);
- });
-
+ changeMailboxName(subOriginalName, subNewName);
+
+ if (log.isDebugEnabled()) log.debug("Rename mailbox sub-mailbox " + subOriginalName + " to "
+ + subNewName);
+ }
+ }
+
+ });
+ }
}
/**
@@ -243,6 +271,19 @@ public abstract class StoreMailboxManage
protected int randomUidValidity() {
return Math.abs(random.nextInt());
}
+
+ /**
+ * Changes the name of the mailbox instance in the cache.
+ * @param from not null
+ * @param to not null
+ */
+ private void changeMailboxName(String from, String to) {
+ final StoreMailbox<Id> jpaMailbox = mailboxes.remove(from);
+ if (jpaMailbox != null) {
+ jpaMailbox.reportRenamed(to);
+ mailboxes.put(to, jpaMailbox);
+ }
+ }
/*
* (non-Javadoc)
@@ -311,24 +352,27 @@ public abstract class StoreMailboxManage
/*
* (non-Javadoc)
- *
- * @see
- * org.apache.james.imap.mailbox.MailboxManager#mailboxExists(java.lang.
- * String, org.apache.james.imap.mailbox.MailboxSession)
+ * @see org.apache.james.imap.mailbox.MailboxManager#mailboxExists(java.lang.String, org.apache.james.imap.mailbox.MailboxSession)
*/
public boolean mailboxExists(String mailboxName, MailboxSession session) throws MailboxException {
- final MailboxMapper<Id> mapper = createMailboxMapper(session);
- final long count = mapper.countMailboxesWithName(mailboxName);
- if (count == 0) {
- return false;
- } else {
- if (count == 1) {
- return true;
+ synchronized (mailboxes) {
+ final MailboxMapper<Id> mapper = createMailboxMapper(session);
+ final long count = mapper.countMailboxesWithName(mailboxName);
+ if (count == 0) {
+ mailboxes.remove(mailboxName);
+ return false;
} else {
- throw new MailboxException(HumanReadableText.DUPLICATE_MAILBOXES, "Expected one mailbox but found " + count + " mailboxes");
+ if (count == 1) {
+ return true;
+ } else {
+ throw new MailboxException(HumanReadableText.DUPLICATE_MAILBOXES,
+ "Expected one mailbox but found " + count + " mailboxes");
+ }
}
}
}
+
+
/*
* (non-Javadoc)
Propchange: james/imap/trunk/store/src/main/java/org/apache/james/imap/store/StoreMailboxManager.java
('svn:mergeinfo' removed)
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org