You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2017/09/29 07:22:01 UTC

[23/31] james-project git commit: MAILBOX-307 Removing unneeded interface-sception for ACLs

http://git-wip-us.apache.org/repos/asf/james-project/blob/4e10f10b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java
deleted file mode 100644
index 2191526..0000000
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SimpleMailboxACL.java
+++ /dev/null
@@ -1,679 +0,0 @@
-/****************************************************************
- * 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.Arrays;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.mailbox.exception.UnsupportedRightException;
-
-import com.github.fge.lambdas.Throwing;
-import com.github.steveash.guavate.Guavate;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Default implementation of {@link MailboxACL}.
- * 
- */
-public class SimpleMailboxACL implements MailboxACL {
-
-    public enum Right implements MailboxACLRight {
-        Administer('a'), // (perform SETACL/DELETEACL/GETACL/LISTRIGHTS)
-        PerformExpunge('e'), //perform EXPUNGE and expunge as a part of CLOSE
-        Insert('i'), //insert (perform APPEND, COPY into mailbox)
-        /*
-        * create mailboxes (CREATE new sub-mailboxes in any
-        * implementation-defined hierarchy, parent mailbox for the new mailbox
-        * name in RENAME)
-        * */
-        CreateMailbox('k'),
-        Lookup('l'), //lookup (mailbox is visible to LIST/LSUB commands, SUBSCRIBE mailbox)
-        Post('p'), //post (send mail to submission address for mailbox, not enforced by IMAP4 itself)
-        Read('r'), //read (SELECT the mailbox, perform STATUS)
-        /**
-         * keep seen/unseen information across sessions (set or clear \SEEN
-         * flag via STORE, also set \SEEN during APPEND/COPY/ FETCH BODY[...])
-         */
-        WriteSeenFlag('s'),
-        DeleteMessages('t'), //delete messages (set or clear \DELETED flag via STORE, set \DELETED flag during APPEND/COPY)
-        /**
-         * write (set or clear flags other than \SEEN and \DELETED via
-         * STORE, also set them during APPEND/COPY)
-         */
-        Write('w'),
-        DeleteMailbox('x'); //delete mailbox (DELETE mailbox, old mailbox name in RENAME)
-
-        private final char rightCharacter;
-
-        Right(char rightCharacter) {
-            this.rightCharacter = rightCharacter;
-        }
-
-        @Override
-        public char asCharacter() {
-            return rightCharacter;
-        }
-
-        public static final EnumSet<Right> allRights = EnumSet.allOf(Right.class);
-
-        public static Right forChar(char c) throws UnsupportedRightException {
-            return Right.allRights
-                .stream()
-                .filter(r -> r.asCharacter() == c)
-                .findFirst()
-                .orElseThrow(() -> new UnsupportedRightException(c));
-        }
-    }
-
-    /**
-     * Supports only the Standard Rights of RFC 4314 section 2.1. The rights are
-     * stored as single bits in 32 bit int {@link #value} field.
-     */
-    public static class Rfc4314Rights implements MailboxACLRights {
-        /**
-         * See RFC 4314 section 2.1.1. Obsolete Rights.
-         */
-        public enum CompatibilityMode {
-            ck_detx, ckx_det, NO_COMPATIBILITY
-        }
-
-        private static final char c_ObsoleteCreate = 'c';
-        private static final char d_ObsoleteDelete = 'd';
-
-        /**
-         * See RFC 4314 section 2.1.1. Obsolete Rights.
-         */
-        private final CompatibilityMode compatibilityMode = CompatibilityMode.ckx_det;
-
-        private final EnumSet<Right> value;
-
-        private Rfc4314Rights(EnumSet<Right> rights) {
-            this.value = EnumSet.copyOf(rights);
-        }
-
-        private Rfc4314Rights() {
-            this(EnumSet.noneOf(Right.class));
-        }
-
-        public Rfc4314Rights(Right... rights) {
-            this(EnumSet.copyOf(Arrays.asList(rights)));
-        }
-
-        public Rfc4314Rights(MailboxACLRight right) throws UnsupportedRightException {
-            this.value = EnumSet.of(Right.forChar(right.asCharacter()));
-        }
-
-        /* Used for json serialization (probably a bad idea) */
-        public Rfc4314Rights(int serializedRights) {
-            List<Right> rights = Right.allRights.stream()
-                .filter(right -> ((serializedRights >> right.ordinal()) & 1) != 0)
-                .collect(Collectors.toList());
-            if (rights.isEmpty()) {
-                this.value = EnumSet.noneOf(Right.class);
-            } else {
-                this.value = EnumSet.copyOf(rights);
-            }
-        }
-
-        public Rfc4314Rights(String serializedRfc4314Rights) throws UnsupportedRightException {
-            List<Right> rights = serializedRfc4314Rights.chars()
-                .mapToObj(i -> (char) i)
-                .flatMap(Throwing.function(this::convert).sneakyThrow())
-                .collect(Collectors.toList());
-            if (rights.isEmpty()) {
-                this.value = EnumSet.noneOf(Right.class);
-            } else {
-                this.value = EnumSet.copyOf(rights);
-            }
-        }
-
-        private Stream<Right> convert(char flag) throws UnsupportedRightException {
-            switch (flag) {
-            case c_ObsoleteCreate:
-                return convertObsoleteCreate(flag);
-            case d_ObsoleteDelete:
-                return convertObsoleteDelete(flag);
-            default:
-                return Stream.of(Right.forChar(flag));
-            }
-        }
-
-        private Stream<Right> convertObsoleteDelete(char flag) throws UnsupportedRightException {
-            switch (compatibilityMode) {
-            case ck_detx:
-                return Stream.of(Right.PerformExpunge, Right.DeleteMessages, Right.DeleteMailbox);
-            case ckx_det:
-                return Stream.of(Right.PerformExpunge, Right.DeleteMessages);
-            case NO_COMPATIBILITY:
-                throw new UnsupportedRightException(flag);
-            default:
-                throw new IllegalStateException("Unexpected enum member: " + CompatibilityMode.class.getName() + "." + compatibilityMode.name());
-            }
-        }
-
-        private Stream<Right> convertObsoleteCreate(char flag) throws UnsupportedRightException {
-            switch (compatibilityMode) {
-            case ck_detx:
-                return Stream.of(Right.CreateMailbox);
-            case ckx_det:
-                return Stream.of(Right.CreateMailbox, Right.DeleteMailbox);
-            case NO_COMPATIBILITY:
-                throw new UnsupportedRightException(flag);
-            default:
-                throw new IllegalStateException("Unexpected enum member: " + CompatibilityMode.class.getName() + "." + compatibilityMode.name());
-            }
-        }
-
-        public boolean contains(char flag) throws UnsupportedRightException {
-            return contains(Right.forChar(flag));
-        }
-
-        @Override
-        public boolean contains(MailboxACLRight right) throws UnsupportedRightException {
-            return value.contains(Right.forChar(right.asCharacter()));
-        }
-
-        /* Used for json serialization (probably a bad idea) */
-        public int serializeAsInteger() {
-            return value.stream().mapToInt(x -> 1 << x.ordinal()).sum();
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o instanceof Rfc4314Rights) {
-                Rfc4314Rights that = (Rfc4314Rights) o;
-                return this.value.equals(that.value);
-            } else if (o instanceof MailboxACLRights) {
-                try {
-                    MailboxACLRights that = (MailboxACLRights) o;
-                    return this.value == new Rfc4314Rights(that.serialize()).value;
-                } catch (UnsupportedRightException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-            return false;
-        }
-
-        @Override
-        public MailboxACLRights except(MailboxACLRights toRemove) throws UnsupportedRightException {
-            EnumSet<Right> copy = EnumSet.copyOf(value);
-            copy.removeAll(convertRightsToList(toRemove));
-            return new Rfc4314Rights(copy);
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return value.isEmpty();
-        }
-
-        @Override
-        public boolean isSupported(MailboxACLRight right) {
-            try {
-                contains(right.asCharacter());
-                return true;
-            } catch (UnsupportedRightException e) {
-                return false;
-            }
-        }
-
-        @Override
-        public Iterator<MailboxACLRight> iterator() {
-            ImmutableList<MailboxACLRight> rights = ImmutableList.copyOf(value);
-            return rights.iterator();
-        }
-
-        @Override
-        public String serialize() {
-            return value.stream()
-                .map(Right::asCharacter)
-                .map(String::valueOf)
-                .collect(Collectors.joining());
-        }
-
-        @Override
-        public String toString() {
-            return serialize();
-        }
-
-        @Override
-        public MailboxACLRights union(MailboxACLRights toAdd) throws UnsupportedRightException {
-            Preconditions.checkNotNull(toAdd);
-            EnumSet<Right> rightUnion = EnumSet.noneOf(Right.class);
-            rightUnion.addAll(value);
-            rightUnion.addAll(convertRightsToList(toAdd));
-            return new Rfc4314Rights(rightUnion);
-        }
-
-        private List<Right> convertRightsToList(MailboxACLRights toAdd) {
-            return ImmutableList.copyOf(Optional.ofNullable(toAdd).orElse(Rfc4314Rights.empty()))
-                .stream()
-                .map(Throwing.function(right -> Right.forChar(right.asCharacter())))
-                .collect(Guavate.toImmutableList());
-        }
-
-        private static MailboxACLRights empty() {
-            return new Rfc4314Rights();
-        }
-
-    }
-
-    /**
-     * A utility implementation of
-     * {@code Map.Entry<MailboxACLEntryKey, MailboxACLRights>}.
-     */
-    public static class SimpleMailboxACLEntry implements Map.Entry<MailboxACLEntryKey, MailboxACLRights> {
-        private final MailboxACLEntryKey key;
-
-        private final MailboxACLRights value;
-
-        public SimpleMailboxACLEntry(MailboxACLEntryKey key, MailboxACLRights value) {
-            super();
-            this.key = key;
-            this.value = value;
-        }
-        public SimpleMailboxACLEntry(String key, String value) throws UnsupportedRightException {
-            this(SimpleMailboxACLEntryKey.deserialize(key), new Rfc4314Rights(value));
-        }
-
-        @Override
-        public MailboxACLEntryKey getKey() {
-            return key;
-        }
-
-        @Override
-        public MailboxACLRights getValue() {
-            return value;
-        }
-
-        /**
-         * Unsupported.
-         * 
-         * @see java.util.Map.Entry#setValue(java.lang.Object)
-         */
-        @Override
-        public MailboxACLRights setValue(MailboxACLRights value) {
-            throw new UnsupportedOperationException("Fields of " + MailboxACLRights.class.getName() + " are read only.");
-        }
-
-    }
-
-    /**
-     * Default implementation of {@link MailboxACLEntryKey}.
-     */
-    public static class SimpleMailboxACLEntryKey implements MailboxACLEntryKey {
-        public static SimpleMailboxACLEntryKey createGroup(String name) {
-            return new SimpleMailboxACLEntryKey(name, NameType.group, false);
-        }
-
-        public static SimpleMailboxACLEntryKey createGroup(String name, boolean negative) {
-            return new SimpleMailboxACLEntryKey(name, NameType.group, negative);
-        }
-
-        public static SimpleMailboxACLEntryKey createUser(String name) {
-            return new SimpleMailboxACLEntryKey(name, NameType.user, false);
-        }
-
-        public static SimpleMailboxACLEntryKey createUser(String name, boolean negative) {
-            return new SimpleMailboxACLEntryKey(name, NameType.user, negative);
-        }
-
-        private final String name;
-        private final NameType nameType;
-        private final boolean negative;
-
-        /**
-         * Creates a new instance of SimpleMailboxACLEntryKey from the given
-         * serialized {@link String}. It supposes that negative rights are
-         * marked with {@link MailboxACL#DEFAULT_NEGATIVE_MARKER} and that
-         * groups are marked with {@link MailboxACL#DEFAULT_GROUP_MARKER}.
-         * 
-         * @param serialized
-         */
-        public static SimpleMailboxACLEntryKey deserialize(String serialized) {
-            Preconditions.checkNotNull(serialized, "Cannot parse null");
-            Preconditions.checkArgument(!serialized.isEmpty(), "Cannot parse an empty string");
-
-            boolean negative = serialized.charAt(0) == DEFAULT_NEGATIVE_MARKER;
-            int nameStart = negative ? 1 : 0;
-            boolean isGroup = serialized.charAt(nameStart) == DEFAULT_GROUP_MARKER;
-            Optional<NameType> explicitNameType = isGroup ? Optional.of(NameType.group) : Optional.empty();
-            String name = isGroup ? serialized.substring(nameStart + 1) : serialized.substring(nameStart);
-
-            if (name.isEmpty()) {
-                throw new IllegalStateException("Cannot parse a string with empty name");
-            }
-            NameType nameType = explicitNameType.orElseGet(() -> computeImplicitNameType(name));
-
-            return new SimpleMailboxACLEntryKey(name, nameType, negative);
-        }
-
-        private static NameType computeImplicitNameType(String name) {
-            boolean isSpecialName = Arrays.stream(SpecialName.values())
-                .anyMatch(specialName -> specialName.name().equals(name));
-            if (isSpecialName) {
-                return NameType.special;
-            }
-            return NameType.user;
-        }
-
-        public SimpleMailboxACLEntryKey(String name, NameType nameType, boolean negative) {
-            Preconditions.checkNotNull(name, "Provide a name for this " + getClass().getName());
-            Preconditions.checkNotNull(nameType, "Provide a nameType for this " + getClass().getName());
-
-            this.name = name;
-            this.nameType = nameType;
-            this.negative = negative;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o instanceof MailboxACLEntryKey) {
-                MailboxACLEntryKey other = (MailboxACLEntryKey) o;
-                return Objects.equals(this.name, other.getName())
-                    && Objects.equals(this.nameType, other.getNameType())
-                    && Objects.equals(this.negative, other.isNegative());
-            }
-            return false;
-        }
-
-
-        public String getName() {
-            return name;
-        }
-
-        public NameType getNameType() {
-            return nameType;
-        }
-
-        @Override
-        public final int hashCode() {
-            return Objects.hash(negative, nameType, name);
-        }
-
-        public boolean isNegative() {
-            return negative;
-        }
-
-        /**
-         * Serializes this {@link SimpleMailboxACLEntryKey} using
-         * {@link MailboxACL#DEFAULT_NEGATIVE_MARKER} and
-         * {@link MailboxACL#DEFAULT_GROUP_MARKER}.
-         * 
-         * @see org.apache.james.mailbox.model.MailboxACL.MailboxACLEntryKey#serialize()
-         */
-        @Override
-        public String serialize() {
-            String negativePart = negative ? String.valueOf(DEFAULT_NEGATIVE_MARKER) : "";
-            String nameTypePart = nameType == NameType.group ? String.valueOf(DEFAULT_GROUP_MARKER) : "";
-
-            return negativePart + nameTypePart + name;
-        }
-
-        @Override
-        public String toString() {
-            return serialize();
-        }
-    }
-
-
-    public static class SimpleMailboxACLCommand implements MailboxACLCommand {
-        private final MailboxACLEntryKey key;
-        private final EditMode editMode;
-        private final MailboxACLRights rights;
-
-        public SimpleMailboxACLCommand(MailboxACLEntryKey key, EditMode editMode, MailboxACLRights rights) {
-            this.key = key;
-            this.editMode = editMode;
-            this.rights = rights;
-        }
-
-        @Override
-        public MailboxACLEntryKey getEntryKey() {
-            return key;
-        }
-
-        @Override
-        public EditMode getEditMode() {
-            return editMode;
-        }
-
-        @Override
-        public MailboxACLRights getRights() {
-            return rights;
-        }
-
-        @Override
-        public final boolean equals(Object o) {
-            if (o instanceof SimpleMailboxACLCommand) {
-                SimpleMailboxACLCommand that = (SimpleMailboxACLCommand) o;
-
-                return Objects.equals(this.key, that.key)
-                    && Objects.equals(this.editMode, that.editMode)
-                    && Objects.equals(this.rights, that.rights);
-            }
-            return false;
-        }
-
-        @Override
-        public final int hashCode() {
-            return Objects.hash(key, editMode, rights);
-        }
-    }
-
-    public static final MailboxACLEntryKey ANYBODY_KEY;
-    public static final MailboxACLEntryKey ANYBODY_NEGATIVE_KEY;
-    public static final MailboxACLEntryKey AUTHENTICATED_KEY;
-    public static final MailboxACLEntryKey AUTHENTICATED_NEGATIVE_KEY;
-    public static final MailboxACL EMPTY;
-
-    public static final MailboxACLRights FULL_RIGHTS;
-
-    public static final MailboxACLRights NO_RIGHTS;
-    public static final MailboxACL OWNER_FULL_ACL;
-    public static final MailboxACL OWNER_FULL_EXCEPT_ADMINISTRATION_ACL;
-
-    public static final MailboxACLEntryKey OWNER_KEY;
-    public static final MailboxACLEntryKey OWNER_NEGATIVE_KEY;
-
-    static {
-        try {
-            ANYBODY_KEY = new SimpleMailboxACLEntryKey(SpecialName.anybody.name(), NameType.special, false);
-            ANYBODY_NEGATIVE_KEY = new SimpleMailboxACLEntryKey(SpecialName.anybody.name(), NameType.special, true);
-            AUTHENTICATED_KEY = new SimpleMailboxACLEntryKey(SpecialName.authenticated.name(), NameType.special, false);
-            AUTHENTICATED_NEGATIVE_KEY = new SimpleMailboxACLEntryKey(SpecialName.authenticated.name(), NameType.special, true);
-            EMPTY = new SimpleMailboxACL();
-            FULL_RIGHTS =  new Rfc4314Rights(Right.allRights);
-            NO_RIGHTS = new Rfc4314Rights();
-            OWNER_KEY = new SimpleMailboxACLEntryKey(SpecialName.owner.name(), NameType.special, false);
-            OWNER_NEGATIVE_KEY = new SimpleMailboxACLEntryKey(SpecialName.owner.name(), NameType.special, true);
-            OWNER_FULL_ACL = new SimpleMailboxACL(new SimpleMailboxACL.SimpleMailboxACLEntry[] { new SimpleMailboxACL.SimpleMailboxACLEntry(SimpleMailboxACL.OWNER_KEY, SimpleMailboxACL.FULL_RIGHTS) });
-            OWNER_FULL_EXCEPT_ADMINISTRATION_ACL = new SimpleMailboxACL(new SimpleMailboxACL.SimpleMailboxACLEntry[] { new SimpleMailboxACL.SimpleMailboxACLEntry(SimpleMailboxACL.OWNER_KEY, SimpleMailboxACL.FULL_RIGHTS.except(new Rfc4314Rights(Right.Administer))) });
-        } catch (UnsupportedRightException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static Map<MailboxACLEntryKey, MailboxACLRights> toMap(Properties props) throws UnsupportedRightException {
-        ImmutableMap.Builder<MailboxACLEntryKey, MailboxACLRights> builder = ImmutableMap.builder();
-        for (Entry<Object, Object> prop : props.entrySet()) {
-            builder.put(SimpleMailboxACLEntryKey.deserialize((String) prop.getKey()), new Rfc4314Rights((String) prop.getValue()));
-        }
-        return builder.build();
-    }
-    
-    private final Map<MailboxACLEntryKey, MailboxACLRights> entries;
-
-    /**
-     * Creates a new instance of SimpleMailboxACL containing no entries.
-     * 
-     */
-    public SimpleMailboxACL() {
-        this(ImmutableMap.of());
-    }
-
-    /**
-     * Creates a new instance of SimpleMailboxACL from the given array of
-     * entries.
-     * 
-     * @param entries
-     */
-    public SimpleMailboxACL(Map.Entry<MailboxACLEntryKey, MailboxACLRights>... entries) {
-        this(ImmutableMap.copyOf(
-            Optional.ofNullable(entries)
-                .map(array -> Arrays.stream(array)
-                    .collect(Guavate.toImmutableMap(Entry::getKey, Entry::getValue)))
-            .orElse(ImmutableMap.of())));
-    }
-
-    /**
-     * Creates a new instance of SimpleMailboxACL from the given {@link Map} of
-     * entries.
-     *
-     * @param entries
-     */
-    public SimpleMailboxACL(Map<MailboxACLEntryKey, MailboxACLRights> entries) {
-        Preconditions.checkNotNull(entries);
-
-        this.entries = ImmutableMap.copyOf(entries);
-    }
-
-    /**
-     * Creates a new instance of SimpleMailboxACL from {@link Properties}. The
-     * keys and values from the <code>props</code> parameter are parsed by the
-     * {@link String} constructors of {@link SimpleMailboxACLEntryKey} and
-     * {@link Rfc4314Rights} respectively.
-     * 
-     * @param props
-     * @throws UnsupportedRightException
-     */
-    public SimpleMailboxACL(Properties props) throws UnsupportedRightException {
-        this(toMap(props));
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o instanceof MailboxACL) {
-            MailboxACL acl = (MailboxACL) o;
-            return Objects.equals(this.getEntries(), acl.getEntries());
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(entries);
-    }
-
-    @Override
-    public MailboxACL apply(MailboxACLCommand aclUpdate) throws UnsupportedRightException {
-        switch (aclUpdate.getEditMode()) {
-            case ADD:
-                return union(aclUpdate.getEntryKey(), aclUpdate.getRights());
-            case REMOVE:
-                return except(aclUpdate.getEntryKey(), aclUpdate.getRights());
-            case REPLACE:
-                return replace(aclUpdate.getEntryKey(), aclUpdate.getRights());
-        }
-        throw new RuntimeException("Unknown edit mode");
-    }
-
-    @Override
-    public MailboxACL except(MailboxACL other) throws UnsupportedRightException {
-        return new SimpleMailboxACL(entries.entrySet()
-            .stream()
-            .map(entry -> Pair.of(entry.getKey(),
-                Optional.ofNullable(other.getEntries().get(entry.getKey()))
-                    .map(Throwing.function(exceptValue -> entry.getValue().except(exceptValue)))
-                    .orElse(entry.getValue())))
-            .filter(pair -> !pair.getValue().isEmpty())
-            .collect(Guavate.toImmutableMap(Entry::getKey, Entry::getValue)));
-    }
-    
-    @Override
-    public MailboxACL except(MailboxACLEntryKey key, MailboxACLRights mailboxACLRights) throws UnsupportedRightException {
-        return except(new SimpleMailboxACL(new SimpleMailboxACLEntry(key, mailboxACLRights)));
-    }
-
-    @Override
-    public Map<MailboxACLEntryKey, MailboxACLRights> getEntries() {
-        return entries;
-    }
-
-    @Override
-    public MailboxACL replace(MailboxACLEntryKey key, MailboxACLRights replacement) throws UnsupportedRightException {
-        if (entries.containsKey(key)) {
-            return new SimpleMailboxACL(
-                entries.entrySet()
-                    .stream()
-                    .map(entry -> Pair.of(entry.getKey(),
-                        entry.getKey().equals(key) ? replacement : entry.getValue()))
-                    .filter(pair -> pair.getValue() != null && !pair.getValue().isEmpty())
-                    .collect(Guavate.toImmutableMap(Pair::getKey, Pair::getValue)));
-        } else {
-            return new SimpleMailboxACL(
-                ImmutableMap.<MailboxACLEntryKey, MailboxACLRights>builder()
-                    .putAll(entries)
-                    .put(key, replacement)
-                    .build());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return entries == null ? "" : entries.toString();
-    }
-
-    @Override
-    public MailboxACL union(MailboxACL other) throws UnsupportedRightException {
-        return new SimpleMailboxACL(
-            Stream.concat(
-                    this.entries.entrySet().stream(),
-                    other.getEntries().entrySet().stream())
-                .collect(Guavate.toImmutableListMultimap(Entry::getKey, Entry::getValue))
-                .asMap()
-                .entrySet()
-                .stream()
-                .map(entry -> Pair.of(entry.getKey(),
-                    entry.getValue()
-                        .stream()
-                        .reduce(
-                            new Rfc4314Rights(),
-                            Throwing.binaryOperator(MailboxACLRights::union))))
-                .collect(Guavate.toImmutableMap(Pair::getKey, Pair::getValue)));
-    }
-    
-    @Override
-    public MailboxACL union(MailboxACLEntryKey key, MailboxACLRights mailboxACLRights) throws UnsupportedRightException {
-        return union(new SimpleMailboxACL(new SimpleMailboxACLEntry(key, mailboxACLRights)));
-    }
-
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org