All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.james.mailbox.model.MailboxPath Maven / Gradle / Ivy

There is a newer version: 3.8.1
Show newest version
/****************************************************************
 * 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.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

import org.apache.james.mailbox.DefaultMailboxes;
import org.apache.james.mailbox.MailboxSession;

import com.google.common.collect.ImmutableList;

/**
 * The path to a mailbox.
 */
public class MailboxPath {
    /**
     * Return a {@link MailboxPath} which represent the INBOX of the given
     * session
     *
     * @param session
     * @return inbox
     */
    public static MailboxPath inbox(MailboxSession session) {
        return MailboxPath.forUser(session.getUser().asString(), MailboxConstants.INBOX);
    }

    /**
     * Create a {@link MailboxPath} in the prive namespace of the specified user
     */
    public static MailboxPath forUser(String username, String mailboxName) {
        return new MailboxPath(MailboxConstants.USER_NAMESPACE, username, mailboxName);
    }

    private final String namespace;
    private final String user;
    private final String name;
    
    public MailboxPath(String namespace, String user, String name) {
        this.namespace = Optional.ofNullable(namespace)
            .filter(s -> !s.isEmpty())
            .orElse(MailboxConstants.USER_NAMESPACE);
        this.user = user;
        this.name = name;
    }

    public MailboxPath(MailboxPath mailboxPath) {
        this(mailboxPath.getNamespace(), mailboxPath.getUser(), mailboxPath.getName());
    }

    public MailboxPath(MailboxPath mailboxPath, String name) {
        this(mailboxPath.getNamespace(), mailboxPath.getUser(), name);
    }

    /**
     * Get the namespace this mailbox is in
     * 
     * @return The namespace
     */
    public String getNamespace() {
        return namespace;
    }

    /**
     * Get the name of the user who owns the mailbox. This can be null e.g. for
     * shared mailboxes.
     * 
     * @return The username
     */
    public String getUser() {
        return user;
    }

    /**
     * Get the name of the mailbox. This is the pure name without user or
     * namespace, so this is what a user would see in his client.
     * 
     * @return The name string
     */
    public String getName() {
        return name;
    }

    public boolean belongsTo(MailboxSession mailboxSession) {
        return user.equalsIgnoreCase(mailboxSession.getUser().asString());
    }

    /**
     * Return a list of MailboxPath representing the hierarchy levels of this
     * MailboxPath. E.g. INBOX.main.sub would yield
     * 
     * 
     * INBOX
     * INBOX.main
     * INBOX.main.sub
     * 
* * @param delimiter * @return list of hierarchy levels */ public List getHierarchyLevels(char delimiter) { if (name == null) { return ImmutableList.of(this); } ArrayList levels = new ArrayList<>(); int index = name.indexOf(delimiter); while (index >= 0) { final String levelname = name.substring(0, index); levels.add(new MailboxPath(namespace, user, levelname)); index = name.indexOf(delimiter, ++index); } levels.add(this); return levels; } public MailboxPath sanitize(char delimiter) { if (name == null) { return this; } if (name.endsWith(String.valueOf(delimiter))) { int length = name.length(); String sanitizedName = name.substring(0, length - 1); return new MailboxPath( namespace, user, sanitizedName); } return this; } public String asString() { return namespace + ":" + user + ":" + name; } public boolean isInbox() { return DefaultMailboxes.INBOX.equalsIgnoreCase(name); } @Override public String toString() { return asString(); } @Override public final boolean equals(Object o) { if (o instanceof MailboxPath) { MailboxPath that = (MailboxPath) o; return Objects.equals(this.namespace, that.namespace) && Objects.equals(this.user, that.user) && Objects.equals(this.name, that.name); } return false; } @Override public final int hashCode() { return Objects.hash(namespace, user, name); } /** * Return the full name of the {@link MailboxPath}, which is constructed via the {@link #namespace} and {@link #name} * * @param delimiter * @return fullName * @deprecated Use {@link MailboxPath#asString()} instead. */ @Deprecated public String getFullName(char delimiter) { return namespace + delimiter + name; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy