blob: 286057ee16756b4c1eeaa55b2be8e7ae879fa35f [file] [log] [blame]
/****************************************************************
* 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.inmemory.mail;
import java.time.Instant;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.james.core.Username;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MailboxSessionUtil;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.ModSeq;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
import org.apache.james.mailbox.inmemory.InMemoryMessageId;
import org.apache.james.mailbox.model.Mailbox;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.store.mail.AttachmentMapper;
import org.apache.james.mailbox.store.mail.MailboxMapper;
import org.apache.james.mailbox.store.mail.MessageIdMapper;
import org.apache.james.mailbox.store.mail.MessageMapper;
import org.apache.james.mailbox.store.mail.model.MapperProvider;
import org.apache.james.mailbox.store.mail.model.MessageUidProvider;
import org.apache.james.utils.UpdatableTickingClock;
import com.google.common.collect.ImmutableList;
public class InMemoryMapperProvider implements MapperProvider {
private static final Username USER = Username.of("user");
private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(USER);
private final MessageId.Factory messageIdFactory;
private final MessageUidProvider messageUidProvider;
private final InMemoryMailboxSessionMapperFactory inMemoryMailboxSessionMapperFactory;
private final UpdatableTickingClock clock;
public InMemoryMapperProvider() {
messageIdFactory = new InMemoryMessageId.Factory();
messageUidProvider = new MessageUidProvider();
clock = new UpdatableTickingClock(Instant.now());
inMemoryMailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory(clock);
}
@Override
public MailboxMapper createMailboxMapper() throws MailboxException {
return inMemoryMailboxSessionMapperFactory.createMailboxMapper(MAILBOX_SESSION);
}
@Override
public MessageMapper createMessageMapper() throws MailboxException {
return inMemoryMailboxSessionMapperFactory.createMessageMapper(MailboxSessionUtil.create(USER));
}
@Override
public MessageIdMapper createMessageIdMapper() throws MailboxException {
return new InMemoryMessageIdMapper(
inMemoryMailboxSessionMapperFactory.createMailboxMapper(MAILBOX_SESSION),
inMemoryMailboxSessionMapperFactory.createMessageMapper(MAILBOX_SESSION));
}
@Override
public AttachmentMapper createAttachmentMapper() throws MailboxException {
return inMemoryMailboxSessionMapperFactory.createAttachmentMapper(MAILBOX_SESSION);
}
@Override
public InMemoryId generateId() {
return InMemoryId.of(ThreadLocalRandom.current().nextInt());
}
@Override
public MessageUid generateMessageUid() {
return messageUidProvider.next();
}
@Override
public boolean supportPartialAttachmentFetch() {
return false;
}
@Override
public MessageId generateMessageId() {
return messageIdFactory.generate();
}
@Override
public List<Capabilities> getSupportedCapabilities() {
return ImmutableList.of(
Capabilities.MESSAGE,
Capabilities.MAILBOX,
Capabilities.ATTACHMENT,
Capabilities.ANNOTATION,
Capabilities.MOVE,
Capabilities.ACL_STORAGE,
Capabilities.UNIQUE_MESSAGE_ID,
Capabilities.FULL_BYTES);
}
@Override
public ModSeq generateModSeq(Mailbox mailbox) throws MailboxException {
return inMemoryMailboxSessionMapperFactory.getModSeqProvider()
.nextModSeq(mailbox);
}
@Override
public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
return inMemoryMailboxSessionMapperFactory.getModSeqProvider()
.highestModSeq(mailbox);
}
public UpdatableTickingClock getClock() {
return clock;
}
}