Skip to content

Commit

Permalink
JAMES-1888: MessageIdManager, persist and delete must be attached to …
Browse files Browse the repository at this point in the history
…MailboxSession
  • Loading branch information
Quynh Nguyen committed Dec 21, 2016
1 parent 81832ae commit 36b0ef6
Show file tree
Hide file tree
Showing 14 changed files with 202 additions and 230 deletions.
@@ -0,0 +1,34 @@
/****************************************************************
* 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.manager;

import org.apache.james.mailbox.model.MailboxPath;

public class MailboxManagerFixture {
public static final String PRIVATE_NAMESPACE = "#private";

public static final String USER = "user";
public static final String OTHER_USER = "otheruser";

public static final MailboxPath MAILBOX_PATH1 = new MailboxPath(PRIVATE_NAMESPACE, USER, "INBOX");
public static final MailboxPath MAILBOX_PATH2 = new MailboxPath(PRIVATE_NAMESPACE, USER, "OUTBOX");
public static final MailboxPath MAILBOX_PATH3 = new MailboxPath(PRIVATE_NAMESPACE, USER, "SENT");
public static final MailboxPath MAILBOX_PATH4 = new MailboxPath(PRIVATE_NAMESPACE, OTHER_USER, "INBOX");
}
Expand Up @@ -44,7 +44,7 @@
import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
import org.apache.james.mailbox.mock.MockMailboxSession;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageId;
Expand All @@ -54,12 +54,10 @@
import org.apache.james.mailbox.store.NoMailboxPathLocker;
import org.apache.james.mailbox.store.StoreMessageIdManager;
import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
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.MailboxMessage;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;

Expand Down Expand Up @@ -101,39 +99,32 @@ public static MessageIdManagerTestSystem createTestingData(QuotaManager quotaMan
new CassandraMessageId.Factory(),
quotaManager,
new DefaultQuotaRootResolver(mapperFactory));
SimpleMailbox mailbox1 = new SimpleMailbox(new MailboxPath("#private", "user", "INBOX"), UID_VALIDITY, CassandraId.timeBased());
SimpleMailbox mailbox2 = new SimpleMailbox(new MailboxPath("#private", "user", "OUTBOX"), UID_VALIDITY, CassandraId.timeBased());
SimpleMailbox mailbox3 = new SimpleMailbox(new MailboxPath("#private", "user", "SENT"), UID_VALIDITY, CassandraId.timeBased());
SimpleMailbox mailbox4 = new SimpleMailbox(new MailboxPath("#public", "otheruser", "INBOX"), UID_VALIDITY, CassandraId.timeBased());
MockMailboxSession mailboxSession = new MockMailboxSession("user");
MailboxMapper mailboxMapper = mapperFactory.getMailboxMapper(mailboxSession);
mailboxMapper.save(mailbox1);
mailboxMapper.save(mailbox2);
mailboxMapper.save(mailbox3);
mailboxMapper.save(mailbox4);

CassandraMailboxManager cassandraMailboxManager = new CassandraMailboxManager(mapperFactory, mock(Authenticator.class), new NoMailboxPathLocker(), new MessageParser(), messageIdFactory);
cassandraMailboxManager.init();

return new CassandraMessageIdManagerTestSystem(messageIdManager, mailboxSession, mailbox1, mailbox2, mailbox3, mailbox4,
messageIdFactory, mapperFactory, mailboxSession, cassandraMailboxManager);
return new CassandraMessageIdManagerTestSystem(messageIdManager, messageIdFactory, mapperFactory, cassandraMailboxManager);
}

private final CassandraMessageId.Factory messageIdFactory;
private final CassandraMailboxSessionMapperFactory mapperFactory;
private final MailboxSession mailboxSession;
private final CassandraMailboxManager cassandraMailboxManager;

public CassandraMessageIdManagerTestSystem(MessageIdManager messageIdManager, MailboxSession session, Mailbox mailbox1, Mailbox mailbox2, Mailbox mailbox3, Mailbox mailbox4, CassandraMessageId.Factory messageIdFactory, CassandraMailboxSessionMapperFactory mapperFactory, MailboxSession mailboxSession, CassandraMailboxManager cassandraMailboxManager) {
super(messageIdManager, session, mailbox1, mailbox2, mailbox3, mailbox4);
public CassandraMessageIdManagerTestSystem(MessageIdManager messageIdManager, CassandraMessageId.Factory messageIdFactory, CassandraMailboxSessionMapperFactory mapperFactory, CassandraMailboxManager cassandraMailboxManager) {
super(messageIdManager);
this.messageIdFactory = messageIdFactory;
this.mapperFactory = mapperFactory;
this.mailboxSession = mailboxSession;
this.cassandraMailboxManager = cassandraMailboxManager;
}

@Override
public MessageId persist(MailboxId mailboxId, MessageUid uid, Flags flags) {
public Mailbox createMailbox(MailboxPath mailboxPath, MailboxSession session) throws MailboxException {
cassandraMailboxManager.createMailbox(mailboxPath, session);
return mapperFactory.getMailboxMapper(session).findMailboxByPath(mailboxPath);
}

@Override
public MessageId persist(MailboxId mailboxId, MessageUid uid, Flags flags, MailboxSession mailboxSession) {
try {
CassandraMessageId messageId = messageIdFactory.generate();
Mailbox mailbox = mapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
Expand All @@ -150,7 +141,7 @@ public MessageId createNotUsedMessageId() {
}

@Override
public void deleteMailbox(MailboxId mailboxId) {
public void deleteMailbox(MailboxId mailboxId, MailboxSession mailboxSession) {
try {
Mailbox mailbox = mapperFactory.getMailboxMapper(mailboxSession).findMailboxById(mailboxId);
cassandraMailboxManager.deleteMailbox(new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), mailbox.getName()), mailboxSession);
Expand Down
Expand Up @@ -27,7 +27,6 @@

import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MailboxSession.SessionType;
import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
Expand Down Expand Up @@ -202,18 +201,22 @@ public MailboxId apply(MessageResult message) {
});
}

private Optional<MessageResult> findMessageWithId(MailboxId mailboxId, final MessageId messageId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
private Optional<MessageResult> findMessageWithId(MailboxId mailboxId, MessageId messageId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
return FluentIterable.from(retrieveAllMessages(mailboxId, fetchGroup, mailboxSession))
.filter(new Predicate<MessageResult>() {

@Override
public boolean apply(MessageResult messageResult) {
return messageResult.getMessageId().equals(messageId);
}
})
.filter(filterByMessageId(messageId))
.first();
}

private Predicate<MessageResult> filterByMessageId(final MessageId messageId) {
return new Predicate<MessageResult>() {

@Override
public boolean apply(MessageResult messageResult) {
return messageResult.getMessageId().equals(messageId);
}
};
}

private ImmutableList<MessageResult> retrieveAllMessages(MailboxId mailboxId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
MessageManager messageManager = mailboxManager.getMailbox(mailboxId, mailboxSession);
return ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), fetchGroup, mailboxSession));
Expand Down
Expand Up @@ -30,10 +30,12 @@
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxMetaData;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MailboxQuery;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
import org.apache.james.mailbox.store.mail.model.Mailbox;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;

import com.google.common.base.Optional;
import com.google.common.base.Predicate;
Expand All @@ -44,24 +46,29 @@ public class InMemoryMessageIdManagerTestSystem extends MessageIdManagerTestSyst

private static final MessageId FIRST_MESSAGE_ID = InMemoryMessageId.of(1);
private static final long ONE_HUNDRED = 100;
private static final int UID_VALIDITY = 1024;

private final MailboxManager mailboxManager;
private final MailboxSession mailboxSession;
private Optional<MessageId> lastMessageIdUsed;

public InMemoryMessageIdManagerTestSystem(MailboxManager mailboxManager, MailboxSession mailboxSession,
Mailbox mailbox1, Mailbox mailbox2, Mailbox mailbox3, Mailbox mailbox4) {
super(new InMemoryMessageIdManager(mailboxManager), mailboxSession, mailbox1, mailbox2, mailbox3, mailbox4);
public InMemoryMessageIdManagerTestSystem(MailboxManager mailboxManager) {
super(new InMemoryMessageIdManager(mailboxManager));
this.mailboxManager = mailboxManager;
this.mailboxSession = mailboxSession;
this.lastMessageIdUsed = Optional.absent();
}

@Override
public MessageId persist(MailboxId mailboxId, MessageUid uid, Flags flags) {
public Mailbox createMailbox(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
mailboxManager.createMailbox(mailboxPath, mailboxSession);
MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession);
return new SimpleMailbox(mailboxPath, UID_VALIDITY, messageManager.getId());
}

@Override
public MessageId persist(MailboxId mailboxId, MessageUid uid, Flags flags, MailboxSession session) {
try {
MessageManager messageManager = mailboxManager.getMailbox(mailboxId, mailboxSession);
MessageId messageId = messageManager.appendMessage(new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), mailboxSession, false, flags)
MessageManager messageManager = mailboxManager.getMailbox(mailboxId, session);
MessageId messageId = messageManager.appendMessage(new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), session, false, flags)
.getMessageId();
lastMessageIdUsed = Optional.of(messageId);
return messageId;
Expand All @@ -76,18 +83,18 @@ public MessageId createNotUsedMessageId() {
}

@Override
public void deleteMailbox(final MailboxId mailboxId) {
public void deleteMailbox(final MailboxId mailboxId, MailboxSession session) {
try {
Optional<MailboxMetaData> mailbox = retrieveMailbox(mailboxId);
Optional<MailboxMetaData> mailbox = retrieveMailbox(mailboxId, session);
if (mailbox.isPresent()) {
mailboxManager.deleteMailbox(mailbox.get().getPath(), mailboxSession);
mailboxManager.deleteMailbox(mailbox.get().getPath(), session);
}
} catch (MailboxException e) {
Throwables.propagate(e);
}
}

private Optional<MailboxMetaData> retrieveMailbox(final MailboxId mailboxId) throws MailboxException {
private Optional<MailboxMetaData> retrieveMailbox(final MailboxId mailboxId, MailboxSession mailboxSession) throws MailboxException {
MailboxQuery userMailboxesQuery = MailboxQuery.builder(mailboxSession).expression("*").build();
return FluentIterable.from(mailboxManager.search(userMailboxesQuery, mailboxSession))
.filter(new Predicate<MailboxMetaData>() {
Expand Down
Expand Up @@ -18,62 +18,28 @@
****************************************************************/
package org.apache.james.mailbox.inmemory;

import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.acl.GroupMembershipResolver;
import org.apache.james.mailbox.acl.MailboxACLResolver;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.exception.BadCredentialsException;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.manager.MailboxManagerFixture;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.FakeAuthenticator;
import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Throwables;

public class MessageIdManagerTestSystemProvider {

private static final int LIMIT_ANNOTATIONS = 3;
private static final int LIMIT_ANNOTATION_SIZE = 30;
private static final int UID_VALIDITY = 1024;
private static final Logger LOGGER = LoggerFactory.getLogger(InMemoryMessageIdManagerStorageTest.class);
private static final String USER = "user";
private static final String OTHER_USER = "otheruser";

private static final String PASSWORD = "password";

public static MessageIdManagerTestSystem createTestingData() {
InMemoryMailboxManager mailboxManager = createMailboxManager();

MailboxSession mailboxSession = createMailboxSession(mailboxManager);
MailboxPath mailboxPath = new MailboxPath("#private", USER, "INBOX");
SimpleMailbox mailbox1 = createMailbox(mailboxManager, mailboxPath, mailboxSession);
MailboxPath mailboxPath2 = new MailboxPath("#private", USER, "mailbox2");
SimpleMailbox mailbox2 = createMailbox(mailboxManager, mailboxPath2, mailboxSession);
MailboxPath mailboxPath3 = new MailboxPath("#private", USER, "mailbox3");
SimpleMailbox mailbox3 = createMailbox(mailboxManager, mailboxPath3, mailboxSession);
MailboxPath mailboxPath4 = new MailboxPath("#public", OTHER_USER, "mailbox4");
SimpleMailbox mailbox4 = createMailbox(mailboxManager, mailboxPath4, mailboxSession);
return new InMemoryMessageIdManagerTestSystem(mailboxManager, mailboxSession, mailbox1, mailbox2, mailbox3, mailbox4);
}

private static MailboxSession createMailboxSession(InMemoryMailboxManager mailboxManager) {
return mailboxManager.createSystemSession(USER, LOGGER);
}

private static SimpleMailbox createMailbox(InMemoryMailboxManager mailboxManager, MailboxPath mailboxPath, MailboxSession mailboxSession) {
try {
mailboxManager.createMailbox(mailboxPath, mailboxSession);
MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession);
return new SimpleMailbox(mailboxPath, UID_VALIDITY, messageManager.getId());
} catch (MailboxException e) {
throw Throwables.propagate(e);
}
return new InMemoryMessageIdManagerTestSystem(createMailboxManager());
}

private static InMemoryMailboxManager createMailboxManager() {
Expand All @@ -84,8 +50,8 @@ private static InMemoryMailboxManager createMailboxManager() {
InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
FakeAuthenticator authenticator = new FakeAuthenticator();
authenticator.addUser(USER, PASSWORD);
authenticator.addUser(OTHER_USER, PASSWORD);
authenticator.addUser(MailboxManagerFixture.USER, PASSWORD);
authenticator.addUser(MailboxManagerFixture.OTHER_USER, PASSWORD);
InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, authenticator,
aclResolver, groupMembershipResolver, messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);

Expand Down
Expand Up @@ -31,7 +31,6 @@
import javax.mail.internet.SharedInputStream;

import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MailboxSession.SessionType;
import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageUid;
Expand Down Expand Up @@ -274,12 +273,12 @@ public boolean apply(MailboxMessage input) {
}

private void allowOnMailboxSession(List<MailboxId> mailboxIds, MailboxSession mailboxSession, MailboxMapper mailboxMapper) throws MailboxNotFoundException {
boolean isForbidden = FluentIterable.from(mailboxIds)
Optional<MailboxId> mailboxForbidden = FluentIterable.from(mailboxIds)
.firstMatch(isMailboxOfOtherUser(mailboxSession, mailboxMapper))
.isPresent();
.or(Optional.<MailboxId>absent());

if (isForbidden) {
throw new MailboxNotFoundException("Mailbox does not belong to session: ");
if (mailboxForbidden.isPresent()) {
throw new MailboxNotFoundException("Mailbox with Id " + mailboxForbidden.get() + " does not belong to session");
}
}

Expand Down
Expand Up @@ -41,7 +41,6 @@
import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MailboxSession.SessionType;
import org.apache.james.mailbox.MailboxSession.User;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageUid;
Expand Down Expand Up @@ -456,8 +455,7 @@ protected MailboxMessage createMessage(Date internalDate, int size, int bodyStar
* @throws MailboxException
*/
public boolean isWriteable(MailboxSession session) throws MailboxException {
return session.getType() == SessionType.System
|| aclResolver.isReadWrite(myRights(session), getSharedPermanentFlags(session));
return aclResolver.isReadWrite(myRights(session), getSharedPermanentFlags(session));
}

/**
Expand Down

0 comments on commit 36b0ef6

Please sign in to comment.