blob: 1080ea072562f3c4a4c0f2297af0243714378731 [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;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import org.apache.james.core.Username;
import org.apache.james.mailbox.model.MailboxConstants;
import com.google.common.base.MoreObjects;
/**
* Mailbox session.
*/
public class MailboxSession {
public static class SessionId {
public static SessionId of(long sessionId) {
return new SessionId(sessionId);
}
private final long sessionId;
private SessionId(long sessionId) {
this.sessionId = sessionId;
}
public long getValue() {
return sessionId;
}
@Override
public final boolean equals(Object o) {
if (o instanceof SessionId) {
SessionId that = (SessionId) o;
return Objects.equals(this.sessionId, that.sessionId);
}
return false;
}
@Override
public final int hashCode() {
return Objects.hash(sessionId);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("sessionId", sessionId)
.toString();
}
}
/**
* Id which will be used for a System session
*/
public static long SYSTEM_SESSION_ID = 0L;
public static boolean isPrimaryAccount(MailboxSession mailboxSession) {
return mailboxSession.loggedInUser
.map(loggedInUser -> loggedInUser.equals(mailboxSession.getUser()))
.orElse(false);
}
public enum SessionType {
/**
* Session was created via the System
*/
System,
/**
* Session belongs to a specific user which was authenticated somehow
*/
User
}
private final Collection<String> sharedSpaces;
private final String otherUsersSpace;
private final String personalSpace;
private final SessionId sessionId;
private final Username userName;
private final Optional<Username> loggedInUser;
private final List<Locale> localePreferences;
private final Map<Object, Object> attributes;
private final char pathSeparator;
private final SessionType type;
public MailboxSession(SessionId sessionId, Username userName, Optional<Username> loggedInUser,
List<Locale> localePreferences, char pathSeparator, SessionType type) {
this(sessionId, userName, loggedInUser, localePreferences, new ArrayList<>(), null, pathSeparator, type);
}
public MailboxSession(SessionId sessionId, Username userName, Optional<Username> loggedInUser,
List<Locale> localePreferences, List<String> sharedSpaces, String otherUsersSpace, char pathSeparator, SessionType type) {
this.sessionId = sessionId;
this.userName = userName;
this.otherUsersSpace = otherUsersSpace;
this.sharedSpaces = sharedSpaces;
this.type = type;
if (otherUsersSpace == null && (sharedSpaces == null || sharedSpaces.isEmpty())) {
this.personalSpace = "";
} else {
this.personalSpace = MailboxConstants.USER_NAMESPACE;
}
this.localePreferences = localePreferences;
this.attributes = new HashMap<>();
this.pathSeparator = pathSeparator;
this.loggedInUser = loggedInUser;
}
/**
* Return if the {@link MailboxSession} is of type {@link SessionType#User} or {@link SessionType#System}
*/
public SessionType getType() {
return type;
}
/**
* Gets the session ID.
*/
public SessionId getSessionId() {
return sessionId;
}
/**
* Gets the user executing this session.
*
* @return not null
*/
public Username getUser() {
return userName;
}
public Optional<Username> getLoggedInUser() {
return loggedInUser;
}
/**
* Gets acceptable localisation for this user in preference order.<br>
* When localising a phrase, each <code>Locale</code> should be tried in
* order until an appropriate translation is obtained.
*
* @return not null, when empty the default local should be used
*/
public List<Locale> getLocalePreferences() {
return localePreferences;
}
/**
* Gets the <a href='http://www.isi.edu/in-notes/rfc2342.txt' rel='tag'>RFC
* 2342</a> personal namespace for the current session.<br>
* Note that though servers may offer multiple personal namespaces, support
* is not offered through this API. This decision may be revised if
* reasonable use cases emerge.
*
* @return Personal Namespace, not null
*/
public String getPersonalSpace() {
return personalSpace;
}
/**
* Gets the <a href='http://www.isi.edu/in-notes/rfc2342.txt' rel='tag'>RFC
* 2342</a> other users namespace for the current session.<br>
* Note that though servers may offer multiple other users namespaces,
* support is not offered through this API. This decision may be revised if
* reasonable use cases emerge.
*
* @return Other Users Namespace or null when there is non available
*/
public String getOtherUsersSpace() {
return otherUsersSpace;
}
/**
* Iterates the <a href='http://www.isi.edu/in-notes/rfc2342.txt'
* rel='tag'>RFC 2342</a> Shared Namespaces available for the current
* session.
*
* @return not null though possibly empty
*/
public Collection<String> getSharedSpaces() {
return sharedSpaces;
}
/**
* Return the stored attributes for this {@link MailboxSession}.
*/
public Map<Object, Object> getAttributes() {
return attributes;
}
/**
* Return server side, folder path separator
*/
public char getPathDelimiter() {
return pathSeparator;
}
/**
* Renders suitably for logging.
*
* @return a <code>String</code> representation of this object.
*/
public String toString() {
String tab = " ";
return "MailboxSession ( " + "sessionId = "
+ this.sessionId + " )";
}
}