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 ro...@apache.org on 2016/08/31 08:06:55 UTC

[06/10] james-project git commit: MAILBOX-270: getmetadata command, mailbox api support get annotation by depth

MAILBOX-270: getmetadata command, mailbox api support get annotation by depth


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7ac9840d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7ac9840d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7ac9840d

Branch: refs/heads/master
Commit: 7ac9840df8198e488564589c7fd8a8610ae928f5
Parents: 0d3c88b
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Tue Jul 5 14:09:04 2016 +0700
Committer: Quynh Nguyen <qn...@linagora.com>
Committed: Tue Aug 30 09:35:06 2016 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MailboxManager.java    | 33 +++++++-
 .../james/mailbox/model/MailboxAnnotation.java  | 47 +++--------
 .../mailbox/model/MailboxAnnotationKey.java     | 88 ++++++++++++++++++++
 .../james/mailbox/MailboxManagerTest.java       | 61 +++++++++++---
 .../mailbox/model/MailboxAnnotationTest.java    | 48 +++++++----
 .../base/MailboxEventAnalyserTest.java          | 15 +++-
 .../FirstUserConnectionFilterThreadTest.java    | 15 +++-
 7 files changed, 239 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7ac9840d/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index 2eac8c3..e2cbdac 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MailboxQuery;
@@ -369,7 +370,8 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
     List<MailboxPath> list(MailboxSession session) throws MailboxException;
 
     /**
-     * Return all mailbox's annotation as the {@link List} of {@link MailboxAnnotation} without order and not duplicated by key
+     * Return all mailbox's annotation as the {@link List} of {@link MailboxAnnotation} without order and
+     * do not contain any two annotations with the same key
      * 
      * @param mailboxPath   the current mailbox
      * @param session       the current session
@@ -379,7 +381,8 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
     List<MailboxAnnotation> getAllAnnotations(MailboxPath mailboxPath, MailboxSession session) throws MailboxException;
 
     /**
-     * Return all mailbox's annotation filter by the list of the keys without order and not duplicated by key
+     * Return all mailbox's annotation filter by the list of the keys without order and
+     * do not contain any two annotations with the same key
      * 
      * @param mailboxPath   the current mailbox
      * @param session       the current session
@@ -387,7 +390,31 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
      * @return              List<MailboxAnnotation>
      * @throws MailboxException in case of selected mailbox does not exist
      */
-    List<MailboxAnnotation> getAnnotationsByKeys(MailboxPath mailboxPath, MailboxSession session, Set<String> keys) throws MailboxException;
+    List<MailboxAnnotation> getAnnotationsByKeys(MailboxPath mailboxPath, MailboxSession session, Set<MailboxAnnotationKey> keys) throws MailboxException;
+
+    /**
+     * Return all mailbox's annotation by the list of the keys and its children entries without order and
+     * do not contain any two annotations with the same key
+     *
+     * @param mailboxPath   the current mailbox
+     * @param session       the current session
+     * @param keys          list of the keys should be filter
+     * @return              List<MailboxAnnotation>
+     * @throws MailboxException in case of selected mailbox does not exist
+     */
+    List<MailboxAnnotation> getAnnotationsByKeysWithOneDepth(MailboxPath mailboxPath, MailboxSession session, Set<MailboxAnnotationKey> keys) throws MailboxException;
+
+    /**
+     * Return all mailbox's annotation by the list of the keys and its below entries without order and
+     * do not contain any two annotations with the same key
+     *
+     * @param mailboxPath   the current mailbox
+     * @param session       the current session
+     * @param keys          list of the keys should be filter
+     * @return              List<MailboxAnnotation>
+     * @throws MailboxException in case of selected mailbox does not exist
+     */
+    List<MailboxAnnotation> getAnnotationsByKeysWithAllDepth(MailboxPath mailboxPath, MailboxSession session, Set<MailboxAnnotationKey> keys) throws MailboxException;
 
     /**
      * Update the mailbox's annotations. This method can:

http://git-wip-us.apache.org/repos/asf/james-project/blob/7ac9840d/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotation.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotation.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotation.java
index b2152d4..22ecf13 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotation.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotation.java
@@ -19,44 +19,33 @@
 
 package org.apache.james.mailbox.model;
 
-import org.apache.commons.lang.StringUtils;
-
-import com.google.common.base.CharMatcher;
 import com.google.common.base.Objects;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 public class MailboxAnnotation {
 
-    private static final CharMatcher NAME_ANNOTATION_PATTERN = CharMatcher.ASCII
-            .and(CharMatcher.inRange('\u0000', '\u0019').negate()).and(CharMatcher.isNot('*'))
-            .and(CharMatcher.isNot('%'));
-    
-    public static final String SLASH_CHARACTER = "/";
-    
-    public static final String TWO_SLASH_CHARACTER = "//";
-    
-    public static MailboxAnnotation nil(String key) {
+    public static MailboxAnnotation nil(MailboxAnnotationKey key) {
         return new MailboxAnnotation(key, Optional.<String> absent());
     }
 
-    public static MailboxAnnotation newInstance(String key, String value) {
+    public static MailboxAnnotation newInstance(MailboxAnnotationKey key, String value) {
         return new MailboxAnnotation(key, Optional.of(value));
     }
 
-    private final String key;
+    private final MailboxAnnotationKey key;
     private final Optional<String> value;
 
-    private MailboxAnnotation(String key, Optional<String> value) {
+    private MailboxAnnotation(MailboxAnnotationKey key, Optional<String> value) {
         Preconditions.checkNotNull(key);
         Preconditions.checkNotNull(value);
-        Preconditions.checkArgument(isValidKey(key), 
-                "Key must start with '/' and not end with '/' and does not contain charater with hex from '\u0000' to '\u00019' or {'*', '%', two consecutive '/'} ");
+        Preconditions.checkArgument(key.isValid(),
+            "Key must start with '/' and not end with '/' and does not contain charater with hex from '\u0000' to '\u00019' or {'*', '%', two consecutive '/'} ");
         this.key = key;
         this.value = value;
     }
 
-    public String getKey() {
+    public MailboxAnnotationKey getKey() {
         return key;
     }
 
@@ -64,24 +53,11 @@ public class MailboxAnnotation {
         return value;
     }
 
-    private static boolean isValidKey(String input) {
-        if (StringUtils.isBlank(input)) {
-            return false;
-        }
-        String key = input.trim();
-        if (!key.startsWith(SLASH_CHARACTER)) {
-            return false;
-        }
-        if (key.contains(TWO_SLASH_CHARACTER)) {
-            return false;
+    public int size() {
+        if (isNil()) {
+            return 0;
         }
-        if (key.endsWith(SLASH_CHARACTER)) {
-            return false;
-        }
-        if (!NAME_ANNOTATION_PATTERN.matchesAllOf(key)) {
-            return false;
-        }
-        return true;
+        return value.get().length();
     }
 
     @Override
@@ -102,4 +78,5 @@ public class MailboxAnnotation {
             return false;
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7ac9840d/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java
new file mode 100644
index 0000000..0817ded
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxAnnotationKey.java
@@ -0,0 +1,88 @@
+/****************************************************************
+ * 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 com.google.common.base.CharMatcher;
+import com.google.common.base.Objects;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * Created by quynh on 04/07/2016.
+ */
+public class MailboxAnnotationKey {
+    public static final String SLASH_CHARACTER = "/";
+
+    public static final String TWO_SLASH_CHARACTER = "//";
+
+    private static final CharMatcher NAME_ANNOTATION_PATTERN = CharMatcher.ASCII
+        .and(CharMatcher.inRange('\u0000', '\u0019').negate()).and(CharMatcher.isNot('*'))
+        .and(CharMatcher.isNot('%'));
+
+    private final String key;
+
+    public MailboxAnnotationKey(String key) {
+        this.key = key;
+    }
+
+    public boolean isValid() {
+        if (StringUtils.isBlank(key)) {
+            return false;
+        }
+        if (key.contains(" ")) {
+            return false;
+        }
+        if (!key.startsWith(SLASH_CHARACTER)) {
+            return false;
+        }
+        if (key.contains(TWO_SLASH_CHARACTER)) {
+            return false;
+        }
+        if (key.endsWith(SLASH_CHARACTER)) {
+            return false;
+        }
+        if (!NAME_ANNOTATION_PATTERN.matchesAllOf(key)) {
+            return false;
+        }
+        return true;
+    }
+
+    public int countSlash() {
+        return StringUtils.countMatches(key, SLASH_CHARACTER);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof MailboxAnnotationKey) {
+            MailboxAnnotationKey anotherKey = (MailboxAnnotationKey)obj;
+            return Objects.equal(anotherKey.getKey(), key);
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(key);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/7ac9840d/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 756ddd9..b578d28 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -31,11 +31,7 @@ import org.apache.james.mailbox.MailboxManager.MailboxCapabilities;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.mock.MockMailboxManager;
-import org.apache.james.mailbox.model.MailboxAnnotation;
-import org.apache.james.mailbox.model.MailboxConstants;
-import org.apache.james.mailbox.model.MailboxMetaData;
-import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.model.MailboxQuery;
+import org.apache.james.mailbox.model.*;
 import org.junit.After;
 import org.junit.Assume;
 import org.junit.Rule;
@@ -63,9 +59,16 @@ public class MailboxManagerTest<T extends MailboxManager> {
     public final static String USER_1 = "USER_1";
     public final static String USER_2 = "USER_2";
 
-    private static final MailboxAnnotation PRIVATE_ANNOTATION = MailboxAnnotation.newInstance("/private/comment", "My private comment");
-    private static final MailboxAnnotation PRIVATE_ANNOTATION_UPDATE = MailboxAnnotation.newInstance("/private/comment", "My updated private comment");
-    private static final MailboxAnnotation SHARED_ANNOTATION =  MailboxAnnotation.newInstance("/shared/comment", "My shared comment");
+    private static final MailboxAnnotationKey PRIVATE_KEY = new MailboxAnnotationKey("/private/comment");
+    private static final MailboxAnnotationKey PRIVATE_CHILD_KEY = new MailboxAnnotationKey("/private/comment/user");
+    private static final MailboxAnnotationKey PRIVATE_GRANDCHILD_KEY = new MailboxAnnotationKey("/private/comment/user/name");
+    private static final MailboxAnnotationKey SHARED_KEY = new MailboxAnnotationKey("/shared/comment");
+
+    private static final MailboxAnnotation PRIVATE_ANNOTATION = MailboxAnnotation.newInstance(PRIVATE_KEY, "My private comment");
+    private static final MailboxAnnotation PRIVATE_CHILD_ANNOTATION = MailboxAnnotation.newInstance(PRIVATE_CHILD_KEY, "My private comment");
+    private static final MailboxAnnotation PRIVATE_GRANDCHILD_ANNOTATION = MailboxAnnotation.newInstance(PRIVATE_GRANDCHILD_KEY, "My private comment");
+    private static final MailboxAnnotation PRIVATE_ANNOTATION_UPDATE = MailboxAnnotation.newInstance(PRIVATE_KEY, "My updated private comment");
+    private static final MailboxAnnotation SHARED_ANNOTATION =  MailboxAnnotation.newInstance(SHARED_KEY, "My shared comment");
 
     private static final List<MailboxAnnotation> ANNOTATIONS = ImmutableList.of(PRIVATE_ANNOTATION, SHARED_ANNOTATION);
 
@@ -264,7 +267,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
 
         mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(PRIVATE_ANNOTATION));
 
-        mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(MailboxAnnotation.nil("/private/comment")));
+        mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(MailboxAnnotation.nil(PRIVATE_KEY)));
         assertThat(mailboxManager.getAllAnnotations(inbox, session)).isEmpty();
     }
 
@@ -319,7 +322,7 @@ public class MailboxManagerTest<T extends MailboxManager> {
 
         mailboxManager.updateAnnotations(inbox, session, ANNOTATIONS);
 
-        assertThat(mailboxManager.getAnnotationsByKeys(inbox, session, ImmutableSet.of("/private/comment")))
+        assertThat(mailboxManager.getAnnotationsByKeys(inbox, session, ImmutableSet.of(PRIVATE_KEY)))
             .containsOnly(PRIVATE_ANNOTATION);
     }
 
@@ -330,7 +333,43 @@ public class MailboxManagerTest<T extends MailboxManager> {
         session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
         MailboxPath inbox = MailboxPath.inbox(session);
 
-        mailboxManager.getAnnotationsByKeys(inbox, session, ImmutableSet.of("/private/comment"));
+        mailboxManager.getAnnotationsByKeys(inbox, session, ImmutableSet.of(PRIVATE_KEY));
+    }
+
+    @ContractTest
+    public void getAnnotationsByKeysWithOneDepthShouldRetriveAnnotationsWithOneDepth() throws BadCredentialsException, MailboxException {
+        Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
+        session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
+        MailboxPath inbox = MailboxPath.inbox(session);
+        mailboxManager.createMailbox(inbox, session);
+
+        mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(PRIVATE_ANNOTATION, PRIVATE_CHILD_ANNOTATION, PRIVATE_GRANDCHILD_ANNOTATION));
+
+        assertThat(mailboxManager.getAnnotationsByKeysWithOneDepth(inbox, session, ImmutableSet.of(PRIVATE_KEY)))
+            .contains(PRIVATE_ANNOTATION, PRIVATE_CHILD_ANNOTATION);
+    }
+
+    @ContractTest
+    public void getAnnotationsByKeysWithAllDepthShouldThrowExceptionWhenMailboxDoesNotExist() throws BadCredentialsException, MailboxException {
+        expected.expect(MailboxException.class);
+        Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
+        session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
+        MailboxPath inbox = MailboxPath.inbox(session);
+
+        mailboxManager.getAnnotationsByKeysWithAllDepth(inbox, session, ImmutableSet.of(PRIVATE_KEY));
+    }
+
+    @ContractTest
+    public void getAnnotationsByKeysWithAllDepthShouldRetriveAnnotationsWithAllDepth() throws BadCredentialsException, MailboxException {
+        Assume.assumeTrue(mailboxManager.hasCapability(MailboxCapabilities.Annotation));
+        session = mailboxManager.createSystemSession(USER_2, LoggerFactory.getLogger("Test"));
+        MailboxPath inbox = MailboxPath.inbox(session);
+        mailboxManager.createMailbox(inbox, session);
+
+        mailboxManager.updateAnnotations(inbox, session, ImmutableList.of(PRIVATE_ANNOTATION, PRIVATE_CHILD_ANNOTATION, PRIVATE_GRANDCHILD_ANNOTATION));
+
+        assertThat(mailboxManager.getAnnotationsByKeysWithAllDepth(inbox, session, ImmutableSet.of(PRIVATE_KEY)))
+            .contains(PRIVATE_ANNOTATION, PRIVATE_CHILD_ANNOTATION, PRIVATE_GRANDCHILD_ANNOTATION);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7ac9840d/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationTest.java
index ba85a58..97fe2eb 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationTest.java
@@ -19,20 +19,33 @@
 
 package org.apache.james.mailbox.model;
 
+import org.junit.Test;
+
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.guava.api.Assertions.assertThat;
 
-import org.junit.Test;
-
 public class MailboxAnnotationTest {
     private static final String ASTERISK_CHARACTER = "*";
 
     private static final String PERCENT_CHARACTER = "%";
 
-    private static final String ANY_KEY = "shared";
-    private static final String ANNOTATION_KEY = "/private/comment"; 
+    private static final MailboxAnnotationKey ANY_KEY = new MailboxAnnotationKey("shared");
+    private static final MailboxAnnotationKey ANNOTATION_KEY = new MailboxAnnotationKey("/private/comment");
     private static final String ANNOTATION_VALUE = "anyValue";
 
+    @Test
+    public void sizeOfAnnotationShouldBeReturnLengthOfValue() throws Exception {
+        MailboxAnnotation mailboxAnnotation = MailboxAnnotation.newInstance(ANNOTATION_KEY, ANNOTATION_VALUE);
+
+        assertThat(mailboxAnnotation.size()).isEqualTo(8);
+    }
+
+    @Test
+    public void sizeOfNilAnnotationShouldBeZero() throws Exception {
+        MailboxAnnotation mailboxAnnotation = MailboxAnnotation.nil(ANNOTATION_KEY);
+
+        assertThat(mailboxAnnotation.size()).isEqualTo(0);
+    }
     @Test(expected = NullPointerException.class)
     public void newInstanceShouldThrowsExceptionWithNullKey() throws Exception {
         MailboxAnnotation.newInstance(null, null);
@@ -45,12 +58,12 @@ public class MailboxAnnotationTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void newInstanceShouldThrowsExceptionWithEmptyKey() throws Exception {
-        MailboxAnnotation.newInstance("", ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey(""), ANNOTATION_VALUE);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void newInstanceShouldThrowsExceptionWithBlankKey() throws Exception {
-        MailboxAnnotation.newInstance("   ", ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey("    "), ANNOTATION_VALUE);
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -60,33 +73,32 @@ public class MailboxAnnotationTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void newInstanceShouldThrowsExceptionWhenKeyContainsAsterisk() throws Exception {
-        MailboxAnnotation.newInstance(buildAnnotationKey(ASTERISK_CHARACTER), ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/key*comment"), ANNOTATION_VALUE);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void newInstanceShouldThrowsExceptionWhenKeyContainsPercent() throws Exception {
-        MailboxAnnotation.newInstance(buildAnnotationKey(PERCENT_CHARACTER), ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/key%comment"), ANNOTATION_VALUE);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void validKeyShouldThrowsExceptionWhenKeyContainsTwoConsecutiveSlash() throws Exception {
-        MailboxAnnotation.newInstance(buildAnnotationKey(MailboxAnnotation.TWO_SLASH_CHARACTER), ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private//keycomment"), ANNOTATION_VALUE);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void validKeyShouldThrowsExceptionWhenKeyEndsWithSlash() throws Exception {
-        MailboxAnnotation.newInstance(buildAnnotationKey(MailboxAnnotation.SLASH_CHARACTER) + MailboxAnnotation.SLASH_CHARACTER, 
-            ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/keycomment/"), ANNOTATION_VALUE);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void validKeyShouldThrowsExceptionWhenKeyContainsNonASCII() throws Exception {
-        MailboxAnnotation.newInstance(buildAnnotationKey("\u252c�"), ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/key\u252c�comment"), ANNOTATION_VALUE);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void validKeyShouldThrowsExceptionWhenKeyContainsTabCharacter() throws Exception {
-        MailboxAnnotation.newInstance(buildAnnotationKey("\t"), ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/key\tcomment"), ANNOTATION_VALUE);
     }
 
     @Test
@@ -104,7 +116,7 @@ public class MailboxAnnotationTest {
 
     @Test
     public void isNilShouldReturnFalseForNotNilObject() throws Exception {
-        MailboxAnnotation nilAnnotation = MailboxAnnotation.newInstance(ANNOTATION_KEY, ANY_KEY);
+        MailboxAnnotation nilAnnotation = MailboxAnnotation.newInstance(ANNOTATION_KEY, ANNOTATION_VALUE);
         assertThat(nilAnnotation.isNil()).isFalse();
     }
 
@@ -117,12 +129,14 @@ public class MailboxAnnotationTest {
     public void newInstanceMailboxAnnotationShouldCreateNewInstance() throws Exception {
         MailboxAnnotation annotation = MailboxAnnotation.newInstance(ANNOTATION_KEY, ANNOTATION_VALUE);
 
-        assertThat(annotation.getKey()).contains(ANNOTATION_KEY);
+        assertThat(annotation.getKey()).isEqualTo(ANNOTATION_KEY);
         assertThat(annotation.getValue()).contains(ANNOTATION_VALUE);
     }
 
-    private String buildAnnotationKey(String apartOfKey) {
-        return MailboxAnnotation.SLASH_CHARACTER + ANY_KEY + apartOfKey + ANY_KEY;
+    @Test
+    public void countSlashShouldReturnRightNumberOfSlash() throws Exception {
+        MailboxAnnotation annotation = MailboxAnnotation.newInstance(new MailboxAnnotationKey("/private/comment/user/name"), ANNOTATION_VALUE);
+        assertThat(annotation.getKey().countSlash()).isEqualTo(4);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7ac9840d/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index 7ea9e0f..35d1a4e 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -56,6 +56,7 @@ import org.apache.james.mailbox.model.MailboxACL.MailboxACLEntryKey;
 import org.apache.james.mailbox.model.MailboxACL.MailboxACLRight;
 import org.apache.james.mailbox.model.MailboxACL.MailboxACLRights;
 import org.apache.james.mailbox.model.MailboxAnnotation;
+import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -396,7 +397,7 @@ public class MailboxEventAnalyserTest {
 
         @Override
         public List<MailboxAnnotation> getAnnotationsByKeys(MailboxPath mailboxPath, MailboxSession session,
-                Set<String> keys) throws MailboxException {
+                Set<MailboxAnnotationKey> keys) throws MailboxException {
             return null;
         }
 
@@ -410,6 +411,18 @@ public class MailboxEventAnalyserTest {
             return null;
         }
 
+        @Override
+        public List<MailboxAnnotation> getAnnotationsByKeysWithOneDepth(MailboxPath mailboxPath, MailboxSession session,
+                Set<MailboxAnnotationKey> keys) throws MailboxException {
+            return null;
+        }
+
+        @Override
+        public List<MailboxAnnotation> getAnnotationsByKeysWithAllDepth(MailboxPath mailboxPath, MailboxSession session,
+                Set<MailboxAnnotationKey> keys) throws MailboxException {
+            return null;
+        }
+
     };
     
     private final class MyMailboxSession implements MailboxSession {

http://git-wip-us.apache.org/repos/asf/james-project/blob/7ac9840d/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
index 641aa4f..7cde34c 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/FirstUserConnectionFilterThreadTest.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.model.MailboxACL.MailboxACLEntryKey;
 import org.apache.james.mailbox.model.MailboxACL.MailboxACLRight;
 import org.apache.james.mailbox.model.MailboxACL.MailboxACLRights;
 import org.apache.james.mailbox.model.MailboxAnnotation;
+import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -220,7 +221,7 @@ public class FirstUserConnectionFilterThreadTest {
         }
 
         @Override
-        public List<MailboxAnnotation> getAnnotationsByKeys(MailboxPath mailboxPath, MailboxSession session, Set<String> keys) throws MailboxException {
+        public List<MailboxAnnotation> getAnnotationsByKeys(MailboxPath mailboxPath, MailboxSession session, Set<MailboxAnnotationKey> keys) throws MailboxException {
             return null;
         }
 
@@ -238,6 +239,18 @@ public class FirstUserConnectionFilterThreadTest {
         public Map<MailboxId, Collection<Long>> search(MultimailboxesSearchQuery expression, MailboxSession session) throws MailboxException {
             return null;
         }
+
+        @Override
+        public List<MailboxAnnotation> getAnnotationsByKeysWithOneDepth(MailboxPath mailboxPath, MailboxSession session,
+                Set<MailboxAnnotationKey> keys) throws MailboxException {
+            return null;
+        }
+
+        @Override
+        public List<MailboxAnnotation> getAnnotationsByKeysWithAllDepth(MailboxPath mailboxPath, MailboxSession session,
+                Set<MailboxAnnotationKey> keys) throws MailboxException {
+            return null;
+        }
     }
 }
 


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