Skip to content

Commit

Permalink
JAMES-1818 Introduce MailboxFactory to simplify MailboxUtils
Browse files Browse the repository at this point in the history
  • Loading branch information
Raphael Ouazana committed Sep 5, 2016
1 parent 268f001 commit 7ecb7ef
Show file tree
Hide file tree
Showing 12 changed files with 317 additions and 214 deletions.
Expand Up @@ -30,6 +30,7 @@
import org.apache.james.jmap.crypto.SignatureHandler;
import org.apache.james.jmap.crypto.SignedTokenFactory;
import org.apache.james.jmap.crypto.SignedTokenManager;
import org.apache.james.jmap.model.MailboxFactory;
import org.apache.james.jmap.model.MessageContentExtractor;
import org.apache.james.jmap.model.MessageFactory;
import org.apache.james.jmap.model.MessagePreviewGenerator;
Expand Down Expand Up @@ -62,6 +63,7 @@ protected void configure() {
bind(MailSpool.class).in(Scopes.SINGLETON);
bind(MailFactory.class).in(Scopes.SINGLETON);
bind(AutomaticallySentMailDetectorImpl.class).in(Scopes.SINGLETON);
bind(MailboxFactory.class).in(Scopes.SINGLETON);
bind(MessageFactory.class).in(Scopes.SINGLETON);
bind(MessagePreviewGenerator.class).in(Scopes.SINGLETON);
bind(MessageContentExtractor.class).in(Scopes.SINGLETON);
Expand Down
Expand Up @@ -30,9 +30,9 @@
import org.apache.james.jmap.model.ClientId;
import org.apache.james.jmap.model.GetMailboxesRequest;
import org.apache.james.jmap.model.GetMailboxesResponse;
import org.apache.james.jmap.model.MailboxFactory;
import org.apache.james.jmap.model.MailboxProperty;
import org.apache.james.jmap.model.mailbox.Mailbox;
import org.apache.james.jmap.utils.MailboxUtils;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.exception.MailboxException;
Expand All @@ -53,12 +53,12 @@ public class GetMailboxesMethod implements Method {
private static final Method.Response.Name RESPONSE_NAME = Method.Response.name("mailboxes");

private final MailboxManager mailboxManager;
private final MailboxUtils mailboxUtils;
private final MailboxFactory mailboxFactory;

@Inject
@VisibleForTesting public GetMailboxesMethod(MailboxManager mailboxManager, MailboxUtils mailboxUtils) {
@VisibleForTesting public GetMailboxesMethod(MailboxManager mailboxManager, MailboxFactory mailboxFactory) {
this.mailboxManager = mailboxManager;
this.mailboxUtils = mailboxUtils;
this.mailboxFactory = mailboxFactory;
}

@Override
Expand Down Expand Up @@ -92,7 +92,7 @@ private GetMailboxesResponse getMailboxesResponse(GetMailboxesRequest mailboxesR
retrieveUserMailboxes(mailboxSession)
.stream()
.map(MailboxMetaData::getPath)
.map(mailboxPath -> mailboxUtils.mailboxFromMailboxPath(mailboxPath, mailboxSession))
.map(mailboxPath -> mailboxFactory.fromMailboxPath(mailboxPath, mailboxSession))
.filter(Optional::isPresent)
.map(Optional::get)
.filter(filterMailboxesById(mailboxesRequest.getIds()))
Expand Down
Expand Up @@ -28,13 +28,13 @@
import org.apache.james.jmap.exceptions.MailboxNameException;
import org.apache.james.jmap.exceptions.MailboxParentNotFoundException;
import org.apache.james.jmap.model.MailboxCreationId;
import org.apache.james.jmap.model.MailboxFactory;
import org.apache.james.jmap.model.SetError;
import org.apache.james.jmap.model.SetMailboxesRequest;
import org.apache.james.jmap.model.SetMailboxesResponse;
import org.apache.james.jmap.model.mailbox.Mailbox;
import org.apache.james.jmap.model.mailbox.MailboxCreateRequest;
import org.apache.james.jmap.utils.DependencyGraph.CycleDetectedException;
import org.apache.james.jmap.utils.MailboxUtils;
import org.apache.james.jmap.utils.SortingHierarchicalCollections;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
Expand All @@ -57,18 +57,18 @@ public class SetMailboxesCreationProcessor implements SetMailboxesProcessor {

private final MailboxManager mailboxManager;
private final SortingHierarchicalCollections<Map.Entry<MailboxCreationId, MailboxCreateRequest>, MailboxCreationId> sortingHierarchicalCollections;
private final MailboxUtils mailboxUtils;
private final MailboxFactory mailboxFactory;
private final Factory mailboxIdFactory;

@Inject
@VisibleForTesting
SetMailboxesCreationProcessor(MailboxManager mailboxManager, MailboxUtils mailboxUtils, MailboxId.Factory mailboxIdFactory) {
SetMailboxesCreationProcessor(MailboxManager mailboxManager, MailboxFactory mailboxFactory, MailboxId.Factory mailboxIdFactory) {
this.mailboxManager = mailboxManager;
this.sortingHierarchicalCollections =
new SortingHierarchicalCollections<Map.Entry<MailboxCreationId, MailboxCreateRequest>, MailboxCreationId>(
x -> x.getKey(),
x -> x.getValue().getParentId());
this.mailboxUtils = mailboxUtils;
this.mailboxFactory = mailboxFactory;
this.mailboxIdFactory = mailboxIdFactory;
}

Expand Down Expand Up @@ -101,7 +101,7 @@ private void createMailbox(MailboxCreationId mailboxCreationId, MailboxCreateReq
ensureValidMailboxName(mailboxRequest, mailboxSession);
MailboxPath mailboxPath = getMailboxPath(mailboxRequest, creationIdsToCreatedMailboxId, mailboxSession);
mailboxManager.createMailbox(mailboxPath, mailboxSession);
Optional<Mailbox> mailbox = mailboxUtils.mailboxFromMailboxPath(mailboxPath, mailboxSession);
Optional<Mailbox> mailbox = mailboxFactory.fromMailboxPath(mailboxPath, mailboxSession);
if (mailbox.isPresent()) {
builder.created(mailboxCreationId, mailbox.get());
creationIdsToCreatedMailboxId.put(mailboxCreationId, mailbox.get().getId());
Expand Down
Expand Up @@ -27,6 +27,7 @@

import org.apache.james.jmap.exceptions.MailboxHasChildException;
import org.apache.james.jmap.exceptions.SystemMailboxNotUpdatableException;
import org.apache.james.jmap.model.MailboxFactory;
import org.apache.james.jmap.model.SetError;
import org.apache.james.jmap.model.SetMailboxesRequest;
import org.apache.james.jmap.model.SetMailboxesResponse;
Expand All @@ -53,16 +54,18 @@ public class SetMailboxesDestructionProcessor implements SetMailboxesProcessor {
private final MailboxManager mailboxManager;
private final SortingHierarchicalCollections<Map.Entry<MailboxId, Mailbox>, MailboxId> sortingHierarchicalCollections;
private final MailboxUtils mailboxUtils;
private final MailboxFactory mailboxFactory;

@Inject
@VisibleForTesting
SetMailboxesDestructionProcessor(MailboxManager mailboxManager, MailboxUtils mailboxUtils) {
SetMailboxesDestructionProcessor(MailboxManager mailboxManager, MailboxUtils mailboxUtils, MailboxFactory mailboxFactory) {
this.mailboxManager = mailboxManager;
this.sortingHierarchicalCollections =
new SortingHierarchicalCollections<>(
Entry::getKey,
x -> x.getValue().getParentId());
this.mailboxUtils = mailboxUtils;
this.mailboxFactory = mailboxFactory;
}

public SetMailboxesResponse process(SetMailboxesRequest request, MailboxSession mailboxSession) {
Expand All @@ -79,7 +82,7 @@ public SetMailboxesResponse process(SetMailboxesRequest request, MailboxSession
private ImmutableMap<MailboxId, Mailbox> mapDestroyRequests(SetMailboxesRequest request, MailboxSession mailboxSession) {
ImmutableMap.Builder<MailboxId, Mailbox> idToMailboxBuilder = ImmutableMap.builder();
request.getDestroy().stream()
.map(id -> mailboxUtils.mailboxFromMailboxId(id, mailboxSession))
.map(id -> mailboxFactory.fromMailboxId(id, mailboxSession))
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(mailbox -> idToMailboxBuilder.put(mailbox.getId(), mailbox));
Expand Down
Expand Up @@ -27,6 +27,7 @@
import org.apache.james.jmap.exceptions.MailboxNameException;
import org.apache.james.jmap.exceptions.MailboxParentNotFoundException;
import org.apache.james.jmap.exceptions.SystemMailboxNotUpdatableException;
import org.apache.james.jmap.model.MailboxFactory;
import org.apache.james.jmap.model.SetError;
import org.apache.james.jmap.model.SetMailboxesRequest;
import org.apache.james.jmap.model.SetMailboxesResponse;
Expand All @@ -53,12 +54,14 @@ public class SetMailboxesUpdateProcessor implements SetMailboxesProcessor {

private final MailboxUtils mailboxUtils;
private final MailboxManager mailboxManager;
private final MailboxFactory mailboxFactory;

@Inject
@VisibleForTesting
SetMailboxesUpdateProcessor(MailboxUtils mailboxUtils, MailboxManager mailboxManager) {
SetMailboxesUpdateProcessor(MailboxUtils mailboxUtils, MailboxManager mailboxManager, MailboxFactory mailboxFactory) {
this.mailboxUtils = mailboxUtils;
this.mailboxManager = mailboxManager;
this.mailboxFactory = mailboxFactory;
}

@Override
Expand Down Expand Up @@ -126,7 +129,7 @@ private void checkRole(Optional<Role> role) throws SystemMailboxNotUpdatableExce
}

private Mailbox getMailbox(MailboxId mailboxId, MailboxSession mailboxSession) throws MailboxNotFoundException {
return mailboxUtils.mailboxFromMailboxId(mailboxId, mailboxSession)
return mailboxFactory.fromMailboxId(mailboxId, mailboxSession)
.orElseThrow(() -> new MailboxNotFoundException(mailboxId.serialize()));
}

Expand Down
@@ -0,0 +1,112 @@
/****************************************************************
* 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.jmap.model;

import java.util.List;
import java.util.Optional;

import javax.inject.Inject;

import org.apache.james.jmap.model.mailbox.Mailbox;
import org.apache.james.jmap.model.mailbox.Role;
import org.apache.james.jmap.model.mailbox.SortOrder;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Splitter;

public class MailboxFactory {
private static final boolean DONT_RESET_RECENT = false;
private static final Logger LOGGER = LoggerFactory.getLogger(MailboxFactory.class);

private final MailboxManager mailboxManager;

@Inject
public MailboxFactory(MailboxManager mailboxManager) {
this.mailboxManager = mailboxManager;
}

public Optional<Mailbox> fromMailboxPath(MailboxPath mailboxPath, MailboxSession mailboxSession) {
try {
MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, mailboxSession);
return fromMessageManager(mailbox, mailboxSession);
} catch (MailboxException e) {
LOGGER.warn("Cannot find mailbox for: " + mailboxPath.getName(), e);
return Optional.empty();
}
}

public Optional<Mailbox> fromMailboxId(MailboxId mailboxId, MailboxSession mailboxSession) {
try {
MessageManager mailbox = mailboxManager.getMailbox(mailboxId, mailboxSession);
return fromMessageManager(mailbox, mailboxSession);
} catch (MailboxException e) {
return Optional.empty();
}
}

private Optional<Mailbox> fromMessageManager(MessageManager messageManager, MailboxSession mailboxSession) throws MailboxException {
MailboxPath mailboxPath = messageManager.getMailboxPath();
Optional<Role> role = Role.from(mailboxPath.getName());
MessageManager.MetaData mailboxMetaData = getMailboxMetaData(messageManager, mailboxSession);
return Optional.ofNullable(Mailbox.builder()
.id(messageManager.getId())
.name(getName(mailboxPath, mailboxSession))
.parentId(getParentIdFromMailboxPath(mailboxPath, mailboxSession).orElse(null))
.role(role)
.unreadMessages(mailboxMetaData.getUnseenCount())
.totalMessages(mailboxMetaData.getMessageCount())
.sortOrder(SortOrder.getSortOrder(role))
.build());
}

private MessageManager.MetaData getMailboxMetaData(MessageManager messageManager, MailboxSession mailboxSession) throws MailboxException {
return messageManager.getMetaData(DONT_RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.UNSEEN_COUNT);
}

@VisibleForTesting String getName(MailboxPath mailboxPath, MailboxSession mailboxSession) {
String name = mailboxPath.getName();
if (name.contains(String.valueOf(mailboxSession.getPathDelimiter()))) {
List<String> levels = Splitter.on(mailboxSession.getPathDelimiter()).splitToList(name);
return levels.get(levels.size() - 1);
}
return name;
}

@VisibleForTesting Optional<MailboxId> getParentIdFromMailboxPath(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
List<MailboxPath> levels = mailboxPath.getHierarchyLevels(mailboxSession.getPathDelimiter());
if (levels.size() <= 1) {
return Optional.empty();
}
MailboxPath parent = levels.get(levels.size() - 2);
return Optional.of(getMailboxId(parent, mailboxSession));
}

private MailboxId getMailboxId(MailboxPath mailboxPath, MailboxSession mailboxSession) throws MailboxException {
return mailboxManager.getMailbox(mailboxPath, mailboxSession)
.getId();
}
}

0 comments on commit 7ecb7ef

Please sign in to comment.