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 ro...@apache.org on 2016/09/05 12:43:58 UTC
[02/10] james-project git commit: JAMES-1818 Introduce getMailboxById
and its implementations
JAMES-1818 Introduce getMailboxById and its implementations
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/22ed8ef2
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/22ed8ef2
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/22ed8ef2
Branch: refs/heads/master
Commit: 22ed8ef29d62d32060f1acd5cb528e5bdab557ce
Parents: ed7268e
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Aug 17 14:48:59 2016 +0200
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Mon Sep 5 14:42:00 2016 +0200
----------------------------------------------------------------------
.../apache/james/mailbox/MailboxManager.java | 17 +++-
.../apache/james/mailbox/MailboxSession.java | 2 +
.../james/mailbox/mock/MockMailboxSession.java | 8 ++
.../mailbox/caching/CachingMailboxMapper.java | 21 +++--
.../cassandra/mail/CassandraMailboxMapper.java | 12 +++
.../mailbox/hbase/mail/HBaseMailboxMapper.java | 27 +++++++
.../hbase/mail/HBaseMailboxMapperTest.java | 19 ++++-
.../mailbox/jcr/mail/JCRMailboxMapper.java | 13 ++++
.../mailbox/jpa/mail/JPAMailboxMapper.java | 13 ++++
.../maildir/mail/MaildirMailboxMapper.java | 7 ++
.../inmemory/mail/InMemoryMailboxMapper.java | 11 +++
.../mailbox/store/SimpleMailboxSession.java | 8 ++
.../mailbox/store/StoreMailboxManager.java | 39 +++++++++-
.../james/mailbox/store/mail/MailboxMapper.java | 12 +++
.../mailbox/store/StoreMailboxManagerTest.java | 82 +++++++++++++++++---
.../store/mail/model/MailboxMapperTest.java | 17 ++++
.../james/imap/processor/LSubProcessorTest.java | 5 ++
.../base/MailboxEventAnalyserTest.java | 5 +-
.../FirstUserConnectionFilterThreadTest.java | 5 ++
.../jmap/methods/GetMessagesMethodTest.java | 5 ++
.../methods/SetVacationResponseMethodTest.java | 5 ++
21 files changed, 308 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index d993c4e..450c4fa 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -115,13 +115,12 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
char getDelimiter();
/**
- * Gets an session suitable for IMAP.
+ * Gets an object managing the given mailbox.
*
* @param mailboxPath
* the Path of the mailbox, not null
* @param session
* the context for this call, not null
- * @return <code>ImapMailboxSession</code>, not null
* @throws MailboxException
* when the mailbox cannot be opened
* @throws MailboxNotFoundException
@@ -130,6 +129,20 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
MessageManager getMailbox(MailboxPath mailboxPath, MailboxSession session) throws MailboxException;
/**
+ * Gets an object managing the given mailbox.
+ *
+ * @param mailboxId
+ * the Id of the mailbox, not null
+ * @param session
+ * the context for this call, not null
+ * @throws MailboxException
+ * when the mailbox cannot be opened
+ * @throws MailboxNotFoundException
+ * when the given mailbox does not exist
+ */
+ MessageManager getMailbox(MailboxId mailboxId, MailboxSession session) throws MailboxException;
+
+ /**
* Creates a new mailbox. Any intermediary mailboxes missing from the
* hierarchy should be created.
*
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
index a9c66e1..55fbe88 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxSession.java
@@ -115,6 +115,8 @@ public interface MailboxSession {
* @return not null, when empty the default local should be used
*/
List<Locale> getLocalePreferences();
+
+ boolean isSameUser(String username);
}
/**
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxSession.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxSession.java b/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxSession.java
index a77f225..9a241a7 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxSession.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/mock/MockMailboxSession.java
@@ -54,6 +54,14 @@ public class MockMailboxSession implements MailboxSession{
public List<Locale> getLocalePreferences() {
return new ArrayList<Locale>();
}
+
+ @Override
+ public boolean isSameUser(String other) {
+ if (username == null) {
+ return other == null;
+ }
+ return username.equalsIgnoreCase(other);
+ }
};
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
index 4c1debe..c311b1d 100644
--- a/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
+++ b/mailbox/caching/src/main/java/org/apache/james/mailbox/caching/CachingMailboxMapper.java
@@ -23,6 +23,7 @@ import java.util.List;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -76,12 +77,20 @@ public class CachingMailboxMapper implements MailboxMapper {
}
}
- @Override
- public List<Mailbox> findMailboxWithPathLike(MailboxPath mailboxPath)
- throws MailboxException {
- // TODO possible to meaningfully cache it?
- return underlying.findMailboxWithPathLike(mailboxPath);
- }
+ @Override
+ public Mailbox findMailboxById(MailboxId mailboxId)
+ throws MailboxException {
+ // TODO possible to meaningfully cache it?
+ return underlying.findMailboxById(mailboxId);
+ }
+
+
+ @Override
+ public List<Mailbox> findMailboxWithPathLike(MailboxPath mailboxPath)
+ throws MailboxException {
+ // TODO possible to meaningfully cache it?
+ return underlying.findMailboxWithPathLike(mailboxPath);
+ }
@Override
public boolean hasChildren(Mailbox mailbox, char delimiter)
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 853e19c..1e81978 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable.MailboxBas
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -92,6 +93,17 @@ public class CassandraMailboxMapper implements MailboxMapper {
}
@Override
+ public Mailbox findMailboxById(MailboxId id) throws MailboxException {
+ CassandraId mailboxId = (CassandraId) id;
+ ResultSet resultSet = session.execute(select(FIELDS).from(TABLE_NAME).where(eq(ID, mailboxId.asUuid())));
+ if (resultSet.isExhausted()) {
+ throw new MailboxNotFoundException(id.serialize());
+ } else {
+ return mailbox(resultSet.one());
+ }
+ }
+
+ @Override
public List<Mailbox> findMailboxWithPathLike(MailboxPath path) throws MailboxException {
Pattern regex = Pattern.compile(constructEscapedRegexForMailboxNameMatching(path));
return getMailboxFilteredByNamespaceAndUserStream(path.getNamespace(), path.getUser())
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
index 628cd8c..8c89e9d 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapper.java
@@ -36,6 +36,7 @@ import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Delete;
+import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
@@ -54,6 +55,7 @@ import org.apache.james.mailbox.hbase.HBaseId;
import org.apache.james.mailbox.hbase.HBaseNonTransactionalMapper;
import org.apache.james.mailbox.hbase.mail.model.HBaseMailbox;
import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -123,6 +125,31 @@ public class HBaseMailboxMapper extends HBaseNonTransactionalMapper implements M
}
}
}
+
+ @Override
+ public Mailbox findMailboxById(MailboxId id) throws MailboxException, MailboxNotFoundException {
+ HBaseId mailboxId = (HBaseId)id;
+ HTable mailboxes = null;
+ try {
+ mailboxes = new HTable(conf, MAILBOXES_TABLE);
+ Get get = new Get(mailboxId.toBytes());
+ Result result = mailboxes.get(get);
+ if (result == null) {
+ throw new MailboxNotFoundException(mailboxId.serialize());
+ }
+ return mailboxFromResult(result);
+ } catch (IOException ex) {
+ throw new MailboxException("IOException in HBase cluster during get()", ex);
+ } finally {
+ if (mailboxes != null) {
+ try {
+ mailboxes.close();
+ } catch (IOException ex) {
+ throw new MailboxException("Error closing table " + mailboxes, ex);
+ }
+ }
+ }
+ }
@Override
public List<Mailbox> findMailboxWithPathLike(MailboxPath mailboxPath) throws MailboxException {
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapperTest.java b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapperTest.java
index 27b5c86..35dc9ff 100644
--- a/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapperTest.java
+++ b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/mail/HBaseMailboxMapperTest.java
@@ -47,9 +47,11 @@ import org.apache.hadoop.hbase.util.Bytes;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.hbase.HBaseClusterSingleton;
+import org.apache.james.mailbox.hbase.HBaseId;
import org.apache.james.mailbox.hbase.io.ChunkInputStream;
import org.apache.james.mailbox.hbase.io.ChunkOutputStream;
import org.apache.james.mailbox.hbase.mail.model.HBaseMailbox;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.junit.Before;
@@ -69,6 +71,7 @@ public class HBaseMailboxMapperTest {
private static HBaseMailboxMapper mapper;
private static List<HBaseMailbox> mailboxList;
private static List<MailboxPath> pathsList;
+ private static List<HBaseId> idsList;
private static final int NAMESPACES = 5;
private static final int USERS = 5;
private static final int MAILBOX_NO = 5;
@@ -108,6 +111,7 @@ public class HBaseMailboxMapperTest {
@Test
public void testMailboxMapperScenario() throws Exception {
testFindMailboxByPath();
+ testFindMailboxById();
testFindMailboxWithPathLike();
testList();
testSave();
@@ -131,6 +135,16 @@ public class HBaseMailboxMapperTest {
}
}
+ private void testFindMailboxById() throws Exception {
+ LOG.info("findMailboxById");
+ HBaseMailbox mailbox;
+ for (MailboxId id : idsList) {
+ LOG.info("Searching for " + id.serialize());
+ mailbox = (HBaseMailbox) mapper.findMailboxById(id);
+ assertEquals(mailbox.getMailboxId(), id);
+ }
+ }
+
/**
* Test of findMailboxWithPathLike method, of class HBaseMailboxMapper.
*/
@@ -301,6 +315,7 @@ public class HBaseMailboxMapperTest {
private static void fillMailboxList() {
mailboxList = new ArrayList<HBaseMailbox>();
pathsList = new ArrayList<MailboxPath>();
+ idsList = new ArrayList<HBaseId>();
MailboxPath path;
String name;
for (int i = 0; i < NAMESPACES; i++) {
@@ -313,7 +328,9 @@ public class HBaseMailboxMapperTest {
}
path = new MailboxPath("namespace" + i, "user" + j, name);
pathsList.add(path);
- mailboxList.add(new HBaseMailbox(path, 13));
+ HBaseMailbox mailbox = new HBaseMailbox(path, 13);
+ mailboxList.add(mailbox);
+ idsList.add(mailbox.getMailboxId());
}
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
index 3ad6988..c546a8c 100644
--- a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
+++ b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/mail/JCRMailboxMapper.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.jcr.AbstractJCRScalingMapper;
import org.apache.james.mailbox.jcr.MailboxSessionJCRRepository;
import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -108,6 +109,18 @@ public class JCRMailboxMapper extends AbstractJCRScalingMapper implements Mailbo
}
}
+ @Override
+ public Mailbox findMailboxById(MailboxId id) throws MailboxException, MailboxNotFoundException {
+ try {
+ Node node = getSession().getNodeByIdentifier(id.serialize());
+ return new JCRMailbox(node, getLogger());
+ } catch (PathNotFoundException e) {
+ throw new MailboxNotFoundException(id.serialize());
+ } catch (RepositoryException e) {
+ throw new MailboxException("Unable to find mailbox " + id.serialize(), e);
+ }
+ }
+
/*
* (non-Javadoc)
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index fd64f9c..c3c7a3a 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.jpa.JPAId;
import org.apache.james.mailbox.jpa.JPATransactionalMapper;
import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -98,6 +99,18 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
}
}
+ @Override
+ public Mailbox findMailboxById(MailboxId id) throws MailboxException, MailboxNotFoundException {
+ JPAId mailboxId = (JPAId)id;
+ try {
+ return (Mailbox) getEntityManager().createNamedQuery("findMailboxById").setParameter("idParam", mailboxId.getRawId()).getSingleResult();
+ } catch (NoResultException e) {
+ throw new MailboxNotFoundException(mailboxId.serialize());
+ } catch (PersistenceException e) {
+ throw new MailboxException("Search of mailbox " + mailboxId.serialize() + " failed", e);
+ }
+ }
+
/**
* @see org.apache.james.mailbox.store.mail.MailboxMapper#delete(Mailbox)
*/
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index 629afb9..73c02d3 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.maildir.MaildirMessageName;
import org.apache.james.mailbox.maildir.MaildirStore;
import org.apache.james.mailbox.model.MailboxACL;
import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -113,6 +114,12 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
return cacheMailbox(mailbox);
}
+ @Override
+ public Mailbox findMailboxById(MailboxId id) throws MailboxException, MailboxNotFoundException {
+ MaildirId mailboxId = (MaildirId)id;
+ return getCachedMailbox(mailboxId);
+ }
+
/**
* @see org.apache.james.mailbox.store.mail.MailboxMapper#findMailboxWithPathLike(org.apache.james.mailbox.model.MailboxPath)
*/
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index 2afecc0..3862b68 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -28,6 +28,7 @@ import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -75,6 +76,16 @@ public class InMemoryMailboxMapper implements MailboxMapper {
}
}
+ public synchronized Mailbox findMailboxById(MailboxId id) throws MailboxException {
+ InMemoryId mailboxId = (InMemoryId)id;
+ Mailbox result = mailboxesById.get(mailboxId);
+ if (result == null) {
+ throw new MailboxNotFoundException(mailboxId.serialize());
+ } else {
+ return result;
+ }
+ }
+
/**
* @see org.apache.james.mailbox.store.mail.MailboxMapper#findMailboxWithPathLike(org.apache.james.mailbox.model.MailboxPath)
*/
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMailboxSession.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMailboxSession.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMailboxSession.java
index d6f1db0..24e5374 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMailboxSession.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/SimpleMailboxSession.java
@@ -198,4 +198,12 @@ public class SimpleMailboxSession implements MailboxSession, MailboxSession.User
return type;
}
+ @Override
+ public boolean isSameUser(String username) {
+ if (this.userName == null) {
+ return username == null;
+ }
+ return this.userName.equalsIgnoreCase(username);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 18f4727..09bba85 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MailboxSession.SessionType;
import org.apache.james.mailbox.MailboxSessionIdGenerator;
+import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.RequestAware;
import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
import org.apache.james.mailbox.acl.GroupMembershipResolver;
@@ -399,7 +400,7 @@ public class StoreMailboxManager implements MailboxManager {
}
@Override
- public org.apache.james.mailbox.MessageManager getMailbox(MailboxPath mailboxPath, MailboxSession session)
+ public MessageManager getMailbox(MailboxPath mailboxPath, MailboxSession session)
throws MailboxException {
final MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
Mailbox mailboxRow = mapper.findMailboxByPath(mailboxPath);
@@ -411,13 +412,43 @@ public class StoreMailboxManager implements MailboxManager {
} else {
session.getLog().debug("Loaded mailbox " + mailboxPath);
- StoreMessageManager m = createMessageManager(mailboxRow, session);
- m.setFetchBatchSize(fetchBatchSize);
- return m;
+ StoreMessageManager messageManager = createMessageManager(mailboxRow, session);
+ messageManager.setFetchBatchSize(fetchBatchSize);
+ return messageManager;
}
}
@Override
+ public MessageManager getMailbox(MailboxId mailboxId, MailboxSession session)
+ throws MailboxException {
+ MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(session);
+ Mailbox mailboxRow = mapper.findMailboxById(mailboxId);
+
+ if (mailboxRow == null) {
+ session.getLog().info("Mailbox '" + mailboxId.serialize() + "' not found.");
+ throw new MailboxNotFoundException(mailboxId.serialize());
+ }
+
+ if (! belongsToCurrentUser(mailboxRow, session)) {
+ session.getLog().info("Mailbox '" + mailboxId.serialize() + "' does not belong to user '" + session.getUser() + "' but to '" + mailboxRow.getUser());
+ throw new MailboxNotFoundException(mailboxId.serialize());
+ }
+
+ session.getLog().debug("Loaded mailbox " + mailboxId.serialize());
+
+ StoreMessageManager messageManager = createMessageManager(mailboxRow, session);
+ messageManager.setFetchBatchSize(fetchBatchSize);
+ return messageManager;
+ }
+
+ private boolean belongsToCurrentUser(Mailbox mailbox, MailboxSession session) {
+ if (session.getUser() == null) {
+ return mailbox.getUser() == null;
+ }
+ return session.getUser().isSameUser(mailbox.getUser());
+ }
+
+ @Override
public void createMailbox(MailboxPath mailboxPath, final MailboxSession mailboxSession)
throws MailboxException {
mailboxSession.getLog().debug("createMailbox " + mailboxPath);
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
index a1f5878..f46a2f8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
@@ -23,6 +23,7 @@ import java.util.List;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.transaction.Mapper;
@@ -63,6 +64,17 @@ public interface MailboxMapper extends Mapper {
throws MailboxException, MailboxNotFoundException;
/**
+ * Return the {@link Mailbox} for the given name
+ *
+ * @param mailboxId
+ * @return mailbox
+ * @throws MailboxException
+ * @throws MailboxNotFoundException
+ */
+ Mailbox findMailboxById(MailboxId mailboxId)
+ throws MailboxException, MailboxNotFoundException;
+
+ /**
* Return a List of {@link Mailbox} which name is like the given name
*
* @param mailboxPath
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index 1fa865d..975e3e3 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -20,10 +20,20 @@
package org.apache.james.mailbox.store;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
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.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.MailboxMapper;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.junit.Before;
@@ -31,17 +41,26 @@ import org.junit.Test;
public class StoreMailboxManagerTest {
+ private static final String CURRENT_USER = "user";
+ private static final MailboxId MAILBOX_ID = TestId.of(123);
public static final int UID_VALIDITY = 42;
private StoreMailboxManager storeMailboxManager;
+ private MailboxMapper mockedMailboxMapper;
+ private MailboxSession mockedMailboxSession;
@Before
- public void setUp() {
- storeMailboxManager = new StoreMailboxManager(null, new MockAuthenticator(), new JVMMailboxPathLocker(), new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), new MessageParser());
+ public void setUp() throws MailboxException {
+ MailboxSessionMapperFactory mockedMapperFactory = mock(MailboxSessionMapperFactory.class);
+ mockedMailboxSession = new MockMailboxSession(CURRENT_USER);
+ mockedMailboxMapper = mock(MailboxMapper.class);
+ when(mockedMapperFactory.getMailboxMapper(mockedMailboxSession))
+ .thenReturn(mockedMailboxMapper);
+ storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, new MockAuthenticator(), new JVMMailboxPathLocker(), new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), new MessageParser());
}
@Test
public void belongsToNamespaceAndUserShouldReturnTrueWithIdenticalMailboxes() {
- MailboxPath path = new MailboxPath("namespace", "user", "name");
+ MailboxPath path = new MailboxPath("namespace", CURRENT_USER, "name");
assertThat(storeMailboxManager.belongsToNamespaceAndUser(path, new SimpleMailbox(path, UID_VALIDITY))).isTrue();
}
@@ -53,9 +72,9 @@ public class StoreMailboxManagerTest {
@Test
public void belongsToNamespaceAndUserShouldReturnTrueWithIdenticalMailboxesWithNullNamespace() {
- MailboxPath path = new MailboxPath(null, "user", "name");
+ MailboxPath path = new MailboxPath(null, CURRENT_USER, "name");
assertThat(storeMailboxManager.belongsToNamespaceAndUser(path,
- new SimpleMailbox(new MailboxPath(null, "user", "name"), UID_VALIDITY))).isTrue();
+ new SimpleMailbox(new MailboxPath(null, CURRENT_USER, "name"), UID_VALIDITY))).isTrue();
}
@Test
@@ -67,21 +86,21 @@ public class StoreMailboxManagerTest {
@Test
public void belongsToNamespaceAndUserShouldReturnTrueWithMailboxWithSameNamespaceAndUser() {
- MailboxPath path = new MailboxPath("namespace", "user", "name");
+ MailboxPath path = new MailboxPath("namespace", CURRENT_USER, "name");
assertThat(storeMailboxManager.belongsToNamespaceAndUser(path,
- new SimpleMailbox(new MailboxPath("namespace", "user", "name2"), UID_VALIDITY))).isTrue();
+ new SimpleMailbox(new MailboxPath("namespace", CURRENT_USER, "name2"), UID_VALIDITY))).isTrue();
}
@Test
public void belongsToNamespaceAndUserShouldReturnFalseWithDifferentNamespace() {
- MailboxPath path = new MailboxPath("namespace", "user", "name");
+ MailboxPath path = new MailboxPath("namespace", CURRENT_USER, "name");
assertThat(storeMailboxManager.belongsToNamespaceAndUser(path,
- new SimpleMailbox(new MailboxPath("namespace2", "user", "name"), UID_VALIDITY))).isFalse();
+ new SimpleMailbox(new MailboxPath("namespace2", CURRENT_USER, "name"), UID_VALIDITY))).isFalse();
}
@Test
public void belongsToNamespaceAndUserShouldReturnFalseWithDifferentUser() {
- MailboxPath path = new MailboxPath("namespace", "user", "name");
+ MailboxPath path = new MailboxPath("namespace", CURRENT_USER, "name");
assertThat(storeMailboxManager.belongsToNamespaceAndUser(path,
new SimpleMailbox(new MailboxPath("namespace", "user2", "name"), UID_VALIDITY))).isFalse();
}
@@ -89,7 +108,7 @@ public class StoreMailboxManagerTest {
public void belongsToNamespaceAndUserShouldReturnFalseWithOneOfTheUserNull() {
MailboxPath path = new MailboxPath("namespace", null, "name");
assertThat(storeMailboxManager.belongsToNamespaceAndUser(path,
- new SimpleMailbox(new MailboxPath("namespace", "user", "name"), UID_VALIDITY))).isFalse();
+ new SimpleMailbox(new MailboxPath("namespace", CURRENT_USER, "name"), UID_VALIDITY))).isFalse();
}
@Test
public void belongsToNamespaceAndUserShouldReturnFalseIfNamespaceAreDifferentWithNullUser() {
@@ -98,6 +117,47 @@ public class StoreMailboxManagerTest {
new SimpleMailbox(new MailboxPath("namespace2", null, "name"), UID_VALIDITY))).isFalse();
}
+ @Test(expected = MailboxNotFoundException.class)
+ public void getMailboxShouldThrowWhenUnknownId() throws Exception {
+ when(mockedMailboxMapper.findMailboxById(MAILBOX_ID)).thenReturn(null);
+ storeMailboxManager.getMailbox(MAILBOX_ID, mockedMailboxSession);
+ }
+
+ @Test
+ public void getMailboxShouldReturnMailboxManagerWhenKnownId() throws Exception {
+ Mailbox mockedMailbox = mock(Mailbox.class);
+ when(mockedMailbox.getUser()).thenReturn(CURRENT_USER);
+ when(mockedMailbox.getMailboxId()).thenReturn(MAILBOX_ID);
+ when(mockedMailboxMapper.findMailboxById(MAILBOX_ID)).thenReturn(mockedMailbox);
+
+ MessageManager expected = storeMailboxManager.getMailbox(MAILBOX_ID, mockedMailboxSession);
+
+ assertThat(expected.getId()).isEqualTo(MAILBOX_ID);
+ }
+
+ @Test
+ public void getMailboxShouldReturnMailboxManagerWhenKnownIdAndDifferentCaseUser() throws Exception {
+ Mailbox mockedMailbox = mock(Mailbox.class);
+ when(mockedMailbox.getUser()).thenReturn("uSEr");
+ when(mockedMailbox.getMailboxId()).thenReturn(MAILBOX_ID);
+ when(mockedMailboxMapper.findMailboxById(MAILBOX_ID)).thenReturn(mockedMailbox);
+
+ MessageManager expected = storeMailboxManager.getMailbox(MAILBOX_ID, mockedMailboxSession);
+
+ assertThat(expected.getId()).isEqualTo(MAILBOX_ID);
+ }
+
+ @Test(expected = MailboxNotFoundException.class)
+ public void getMailboxShouldThrowWhenMailboxDoesNotMatchUser() throws Exception {
+ Mailbox mockedMailbox = mock(Mailbox.class);
+ when(mockedMailbox.getUser()).thenReturn("other.user");
+ when(mockedMailbox.getMailboxId()).thenReturn(MAILBOX_ID);
+ when(mockedMailboxMapper.findMailboxById(MAILBOX_ID)).thenReturn(mockedMailbox);
+
+ MessageManager expected = storeMailboxManager.getMailbox(MAILBOX_ID, mockedMailboxSession);
+
+ assertThat(expected.getId()).isEqualTo(MAILBOX_ID);
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
index 2bf50c4..d80c252 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
@@ -26,6 +26,7 @@ import java.util.List;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
@@ -248,7 +249,23 @@ public class MailboxMapperTest<T extends MapperProvider> {
MailboxPath regexPath = new MailboxPath(benwaInboxPath.getNamespace(), benwaInboxPath.getUser(), "INB?X");
assertThat(mailboxMapper.findMailboxWithPathLike(regexPath)).isEmpty();
}
+
+ @ContractTest
+ public void findMailboxByIdShouldReturnExistingMailbox() throws MailboxException {
+ saveAll();
+ Mailbox actual = mailboxMapper.findMailboxById(benwaInboxMailbox.getMailboxId());
+ assertThat(actual).isEqualTo(benwaInboxMailbox);
+ }
+ @ContractTest
+ public void findMailboxByIdShouldFailWhenAbsent() throws MailboxException {
+ expected.expect(MailboxNotFoundException.class);
+ saveAll();
+ MailboxId removed = benwaInboxMailbox.getMailboxId();
+ mailboxMapper.delete(benwaInboxMailbox);
+ mailboxMapper.findMailboxById(removed);
+ }
+
private void saveAll() throws MailboxException{
mailboxMapper.save(benwaInboxMailbox);
mailboxMapper.save(benwaWorkMailbox);
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
index 58856f9..709754f 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
@@ -263,6 +263,11 @@ public class LSubProcessorTest {
public String getUserName() {
return "test";
}
+
+ @Override
+ public boolean isSameUser(String username) {
+ return "test".equalsIgnoreCase(username);
+ }
}));
oneOf(manager).subscriptions(with(same(mailboxSession)));will(returnValue(subscriptions));
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index c6d2e89..39bcb27 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -338,7 +338,10 @@ public class MailboxEventAnalyserTest {
}
};
}
-
+
+ public MessageManager getMailbox(MailboxId mailboxId, MailboxSession session) throws MailboxException {
+ return getMailbox((MailboxPath)null, session);
+ }
public char getDelimiter() {
return '.';
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
index c64cace..bde96d6 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
@@ -136,6 +136,11 @@ public class FirstUserConnectionFilterThreadTest {
}
@Override
+ public MessageManager getMailbox(MailboxId mailboxId, MailboxSession session) throws MailboxException {
+ return null;
+ }
+
+ @Override
public void createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
index 8b2ccdd..09f06e0 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
@@ -98,6 +98,11 @@ public class GetMessagesMethodTest {
public List<Locale> getLocalePreferences() {
return ImmutableList.of();
}
+
+ @Override
+ public boolean isSameUser(String username) {
+ return this.username.equalsIgnoreCase(username);
+ }
}
private static final User ROBERT = new User("robert", "secret");
http://git-wip-us.apache.org/repos/asf/james-project/blob/22ed8ef2/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetVacationResponseMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetVacationResponseMethodTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetVacationResponseMethodTest.java
index 85c9a5e..485ec15 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetVacationResponseMethodTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetVacationResponseMethodTest.java
@@ -68,6 +68,11 @@ public class SetVacationResponseMethodTest {
public List<Locale> getLocalePreferences() {
return null;
}
+
+ @Override
+ public boolean isSameUser(String username) {
+ return USERNAME.equalsIgnoreCase(username);
+ }
};
public static final String SUBJECT = "subject";
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org