blob: 2609827787af840a7656cc8a9012480ead132b5b [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.jmap.draft.model.mailbox;
import java.util.Objects;
import java.util.Optional;
import org.apache.james.jmap.methods.JmapResponseWriterImpl;
import org.apache.james.jmap.model.Number;
import org.apache.james.jmap.model.mailbox.Rights;
import org.apache.james.mailbox.Role;
import org.apache.james.mailbox.model.MailboxId;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
@JsonDeserialize(builder = Mailbox.Builder.class)
@JsonFilter(JmapResponseWriterImpl.PROPERTIES_FILTER)
public class Mailbox {
public static Builder builder() {
return new Builder();
}
@JsonPOJOBuilder(withPrefix = "")
public static class Builder {
private MailboxId id;
private String name;
private Optional<MailboxId> parentId;
private Optional<Role> role;
private SortOrder sortOrder;
private boolean mustBeOnlyMailbox;
private boolean mayReadItems;
private boolean mayAddItems;
private boolean mayRemoveItems;
private boolean mayCreateChild;
private boolean mayRename;
private boolean mayDelete;
private Optional<Number> totalMessages;
private Optional<Number> unreadMessages;
private Optional<Number> totalThreads;
private Optional<Number> unreadThreads;
private Optional<Rights> sharedWith;
private Optional<MailboxNamespace> namespace;
private Optional<Quotas> quotas;
private Builder() {
parentId = Optional.empty();
sharedWith = Optional.empty();
namespace = Optional.empty();
totalMessages = Optional.empty();
unreadMessages = Optional.empty();
totalThreads = Optional.empty();
unreadThreads = Optional.empty();
role = Optional.empty();
quotas = Optional.empty();
}
public Builder id(MailboxId id) {
Preconditions.checkNotNull(id);
this.id = id;
return this;
}
public Builder name(String name) {
Preconditions.checkNotNull(name);
this.name = name;
return this;
}
public Builder parentId(MailboxId parentId) {
this.parentId = Optional.ofNullable(parentId);
return this;
}
public Builder role(Optional<Role> role) {
this.role = role;
return this;
}
public Builder sortOrder(SortOrder sortOrder) {
this.sortOrder = sortOrder;
return this;
}
public Builder mustBeOnlyMailbox(boolean mustBeOnlyMailbox) {
this.mustBeOnlyMailbox = mustBeOnlyMailbox;
return this;
}
public Builder mayReadItems(boolean mayReadItems) {
this.mayReadItems = mayReadItems;
return this;
}
public Builder mayAddItems(boolean mayAddItems) {
this.mayAddItems = mayAddItems;
return this;
}
public Builder mayRemoveItems(boolean mayRemoveItems) {
this.mayRemoveItems = mayRemoveItems;
return this;
}
public Builder mayCreateChild(boolean mayCreateChild) {
this.mayCreateChild = mayCreateChild;
return this;
}
public Builder mayRename(boolean mayRename) {
this.mayRename = mayRename;
return this;
}
public Builder mayDelete(boolean mayDelete) {
this.mayDelete = mayDelete;
return this;
}
public Builder totalMessages(long totalMessages) {
this.totalMessages = Optional.of(Number.BOUND_SANITIZING_FACTORY.from(totalMessages));
return this;
}
public Builder unreadMessages(long unreadMessages) {
this.unreadMessages = Optional.of(Number.BOUND_SANITIZING_FACTORY.from(unreadMessages));
return this;
}
public Builder totalThreads(long totalThreads) {
this.totalThreads = Optional.of(Number.BOUND_SANITIZING_FACTORY.from(totalThreads));
return this;
}
public Builder unreadThreads(long unreadThreads) {
this.unreadThreads = Optional.of(Number.BOUND_SANITIZING_FACTORY.from(unreadThreads));
return this;
}
public Builder sharedWith(Rights sharedWith) {
this.sharedWith = Optional.of(sharedWith);
return this;
}
public Builder namespace(MailboxNamespace namespace) {
this.namespace = Optional.of(namespace);
return this;
}
public Builder quotas(Quotas quotas) {
this.quotas = Optional.of(quotas);
return this;
}
public Mailbox build() {
Preconditions.checkState(!Strings.isNullOrEmpty(name), "'name' is mandatory");
Preconditions.checkState(id != null, "'id' is mandatory");
return new Mailbox(id,
name,
parentId,
role,
sortOrder,
mustBeOnlyMailbox,
mayReadItems,
mayAddItems,
mayRemoveItems,
mayCreateChild,
mayRename,
mayDelete,
totalMessages.orElse(Number.ZERO),
unreadMessages.orElse(Number.ZERO),
totalThreads.orElse(Number.ZERO),
unreadThreads.orElse(Number.ZERO),
sharedWith.orElse(Rights.EMPTY),
namespace.orElse(MailboxNamespace.personal()),
quotas);
}
}
private final MailboxId id;
private final String name;
private final Optional<MailboxId> parentId;
private final Optional<Role> role;
private final SortOrder sortOrder;
private final boolean mustBeOnlyMailbox;
private final boolean mayReadItems;
private final boolean mayAddItems;
private final boolean mayRemoveItems;
private final boolean mayCreateChild;
private final boolean mayRename;
private final boolean mayDelete;
private final Number totalMessages;
private final Number unreadMessages;
private final Number totalThreads;
private final Number unreadThreads;
private final Rights sharedWith;
private final MailboxNamespace namespace;
private final Optional<Quotas> quotas;
@VisibleForTesting Mailbox(MailboxId id, String name, Optional<MailboxId> parentId, Optional<Role> role, SortOrder sortOrder, boolean mustBeOnlyMailbox,
boolean mayReadItems, boolean mayAddItems, boolean mayRemoveItems, boolean mayCreateChild, boolean mayRename, boolean mayDelete,
Number totalMessages, Number unreadMessages, Number totalThreads, Number unreadThreads, Rights sharedWith, MailboxNamespace namespace,
Optional<Quotas> quotas) {
this.id = id;
this.name = name;
this.parentId = parentId;
this.role = role;
this.sortOrder = sortOrder;
this.mustBeOnlyMailbox = mustBeOnlyMailbox;
this.mayReadItems = mayReadItems;
this.mayAddItems = mayAddItems;
this.mayRemoveItems = mayRemoveItems;
this.mayCreateChild = mayCreateChild;
this.mayRename = mayRename;
this.mayDelete = mayDelete;
this.totalMessages = totalMessages;
this.unreadMessages = unreadMessages;
this.totalThreads = totalThreads;
this.unreadThreads = unreadThreads;
this.sharedWith = sharedWith;
this.namespace = namespace;
this.quotas = quotas;
}
public MailboxId getId() {
return id;
}
public String getName() {
return name;
}
public Optional<MailboxId> getParentId() {
return parentId;
}
public Optional<Role> getRole() {
return role;
}
public SortOrder getSortOrder() {
return sortOrder;
}
public boolean isMustBeOnlyMailbox() {
return mustBeOnlyMailbox;
}
public boolean isMayReadItems() {
return mayReadItems;
}
public boolean isMayAddItems() {
return mayAddItems;
}
public boolean isMayRemoveItems() {
return mayRemoveItems;
}
public boolean isMayCreateChild() {
return mayCreateChild;
}
public boolean isMayRename() {
return mayRename;
}
public boolean isMayDelete() {
return mayDelete;
}
public Number getTotalMessages() {
return totalMessages;
}
public Number getUnreadMessages() {
return unreadMessages;
}
public Number getTotalThreads() {
return totalThreads;
}
public Number getUnreadThreads() {
return unreadThreads;
}
public Rights getSharedWith() {
return sharedWith;
}
public MailboxNamespace getNamespace() {
return namespace;
}
public Optional<Quotas> getQuotas() {
return quotas;
}
@JsonIgnore
public boolean hasRole(Role role) {
return this.role
.map(currentRole -> Objects.equals(currentRole, role))
.orElse(false);
}
@JsonIgnore
public boolean hasSystemRole() {
return role.map(Role::isSystemRole).orElse(false);
}
@Override
public final boolean equals(Object obj) {
if (obj instanceof Mailbox) {
Mailbox other = (Mailbox) obj;
return Objects.equals(this.id, other.id)
&& Objects.equals(this.name, other.name)
&& Objects.equals(this.parentId, other.parentId)
&& Objects.equals(this.role, other.role)
&& Objects.equals(this.sortOrder, other.sortOrder)
&& Objects.equals(this.mustBeOnlyMailbox, other.mustBeOnlyMailbox)
&& Objects.equals(this.mayReadItems, other.mayReadItems)
&& Objects.equals(this.mayAddItems, other.mayAddItems)
&& Objects.equals(this.mayRemoveItems, other.mayRemoveItems)
&& Objects.equals(this.mayCreateChild, other.mayCreateChild)
&& Objects.equals(this.mayRename, other.mayRename)
&& Objects.equals(this.mayDelete, other.mayDelete)
&& Objects.equals(this.totalMessages, other.totalMessages)
&& Objects.equals(this.unreadMessages, other.unreadMessages)
&& Objects.equals(this.totalThreads, other.totalThreads)
&& Objects.equals(this.unreadThreads, other.unreadThreads)
&& Objects.equals(this.sharedWith, other.sharedWith)
&& Objects.equals(this.namespace, other.namespace)
&& Objects.equals(this.quotas, other.quotas);
}
return false;
}
@Override
public final int hashCode() {
return Objects.hash(id, name, parentId, role, sortOrder, mustBeOnlyMailbox, mayReadItems, mayAddItems,
mayRemoveItems, mayCreateChild, mayRename, mayDelete, totalMessages, unreadMessages, totalThreads,
unreadThreads, sharedWith, namespace, quotas);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("id", id)
.add("name", name)
.add("sortOrder", sortOrder)
.toString();
}
}