MAILBOX-270: Refactor cause adding new class MailboxAnnotationKey

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

Branch: refs/heads/master
Commit: c25c6740e7748fd5b1de5253b5588373f08c083a
Parents: a416424
Author: Quynh Nguyen <[email protected]>
Authored: Tue Jul 5 14:14:39 2016 +0700
Committer: Quynh Nguyen <[email protected]>
Committed: Wed Aug 31 09:23:17 2016 +0700

----------------------------------------------------------------------
 .../james/mailbox/model/MailboxAnnotation.java  |  2 -
 .../mailbox/model/MailboxAnnotationKey.java     | 21 ++---
 .../mailbox/model/MailboxAnnotationKeyTest.java | 96 ++++++++++++++++++++
 .../mailbox/model/MailboxAnnotationTest.java    | 56 +-----------
 .../mail/CassandraAnnotationMapper.java         | 13 ++-
 .../inmemory/mail/InMemoryAnnotationMapper.java |  6 +-
 .../store/mail/model/AnnotationMapperTest.java  | 10 ++
 .../parser/SetAnnotationCommandParser.java      |  9 +-
 .../parser/SetAnnotationCommandParserTest.java  | 12 ++-
 .../encode/AnnotationResponseEncoderTest.java   |  2 +-
 .../processor/SetAnnotationProcessorTest.java   |  3 +-
 11 files changed, 145 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/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 22ecf13..ff9897d 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
@@ -39,8 +39,6 @@ public class MailboxAnnotation {
     private MailboxAnnotation(MailboxAnnotationKey key, Optional<String> 
value) {
         Preconditions.checkNotNull(key);
         Preconditions.checkNotNull(value);
-        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;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/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
index 0817ded..09906b4 100644
--- 
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
@@ -21,27 +21,26 @@ package org.apache.james.mailbox.model;
 
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
 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 static final CharMatcher NAME_ANNOTATION_PATTERN = 
CharMatcher.JAVA_LETTER_OR_DIGIT
+        .or(CharMatcher.is('/'));
 
     private final String key;
 
     public MailboxAnnotationKey(String key) {
+        Preconditions.checkArgument(isValid(key),
+            "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;
     }
 
-    public boolean isValid() {
+    private boolean isValid(String key) {
         if (StringUtils.isBlank(key)) {
             return false;
         }
@@ -63,19 +62,19 @@ public class MailboxAnnotationKey {
         return true;
     }
 
-    public int countSlash() {
+    public int countComponents() {
         return StringUtils.countMatches(key, SLASH_CHARACTER);
     }
 
-    public String getKey() {
-        return key;
+    public String asString() {
+        return key.toLowerCase();
     }
 
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof MailboxAnnotationKey) {
             MailboxAnnotationKey anotherKey = (MailboxAnnotationKey)obj;
-            return Objects.equal(anotherKey.getKey(), key);
+            return Objects.equal(anotherKey.asString(), key);
         } else {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationKeyTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationKeyTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationKeyTest.java
new file mode 100644
index 0000000..e6f3503
--- /dev/null
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxAnnotationKeyTest.java
@@ -0,0 +1,96 @@
+/****************************************************************
+ * 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 org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class MailboxAnnotationKeyTest {
+    @Test(expected = IllegalArgumentException.class)
+    public void newInstanceShouldThrowsExceptionWhenKeyDoesNotStartWithSlash() 
throws Exception {
+        new MailboxAnnotationKey("shared");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void newInstanceShouldThrowsExceptionWhenKeyContainsAsterisk() 
throws Exception {
+        new MailboxAnnotationKey("/private/key*comment");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void newInstanceShouldThrowsExceptionWhenKeyContainsPercent() 
throws Exception {
+        new MailboxAnnotationKey("/private/key%comment");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void 
validKeyShouldThrowsExceptionWhenKeyContainsTwoConsecutiveSlash() throws 
Exception {
+        new MailboxAnnotationKey("/private//keycomment");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validKeyShouldThrowsExceptionWhenKeyEndsWithSlash() throws 
Exception {
+        new MailboxAnnotationKey("/private/keycomment/");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validKeyShouldThrowsExceptionWhenKeyContainsNonASCII() throws 
Exception {
+        new MailboxAnnotationKey("/private/key comment");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void validKeyShouldThrowsExceptionWhenKeyContainsTabCharacter() 
throws Exception {
+        new MailboxAnnotationKey("/private/key\tcomment");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void newInstanceShouldThrowsExceptionWithEmptyKey() throws 
Exception {
+        new MailboxAnnotationKey("");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void newInstanceShouldThrowsExceptionWithBlankKey() throws 
Exception {
+        new MailboxAnnotationKey("    ");
+    }
+
+    @Test
+    public void newInstanceShouldReturnRightKeyValue() throws Exception {
+        MailboxAnnotationKey annotationKey = new 
MailboxAnnotationKey("/private/comment");
+        assertThat(annotationKey.asString()).isEqualTo("/private/comment");
+    }
+
+    @Test
+    public void keyValueShouldBeCaseInsensitive() throws Exception {
+        MailboxAnnotationKey annotationKey = new 
MailboxAnnotationKey("/private/comment");
+        MailboxAnnotationKey anotherAnnotationKey = new 
MailboxAnnotationKey("/PRIVATE/COMMENT");
+
+        assertThat(annotationKey.equals(anotherAnnotationKey)).isTrue();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void 
newInstanceShouldThrowsExceptionWhenKeyContainsPunctuationCharacters() throws 
Exception {
+        new MailboxAnnotationKey("/private/+comment");
+    }
+
+    @Test
+    public void countSlashShouldReturnRightNumberOfSlash() throws Exception {
+        MailboxAnnotationKey annotationKey = new 
MailboxAnnotationKey("/private/comment/user/name");
+        assertThat(annotationKey.countComponents()).isEqualTo(4);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/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 97fe2eb..fc114bc 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
@@ -29,7 +29,6 @@ public class MailboxAnnotationTest {
 
     private static final String PERCENT_CHARACTER = "%";
 
-    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";
 
@@ -53,52 +52,7 @@ public class MailboxAnnotationTest {
 
     @Test(expected = NullPointerException.class)
     public void newInstanceShouldThrowsExceptionWithNullValue() throws 
Exception {
-        MailboxAnnotation.newInstance(ANY_KEY, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void newInstanceShouldThrowsExceptionWithEmptyKey() throws 
Exception {
-        MailboxAnnotation.newInstance(new MailboxAnnotationKey(""), 
ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void newInstanceShouldThrowsExceptionWithBlankKey() throws 
Exception {
-        MailboxAnnotation.newInstance(new MailboxAnnotationKey("    "), 
ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void newInstanceShouldThrowsExceptionWhenKeyDoesNotStartWithSlash() 
throws Exception {
-        MailboxAnnotation.newInstance(ANY_KEY, ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void newInstanceShouldThrowsExceptionWhenKeyContainsAsterisk() 
throws Exception {
-        MailboxAnnotation.newInstance(new 
MailboxAnnotationKey("/private/key*comment"), ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void newInstanceShouldThrowsExceptionWhenKeyContainsPercent() 
throws Exception {
-        MailboxAnnotation.newInstance(new 
MailboxAnnotationKey("/private/key%comment"), ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void 
validKeyShouldThrowsExceptionWhenKeyContainsTwoConsecutiveSlash() throws 
Exception {
-        MailboxAnnotation.newInstance(new 
MailboxAnnotationKey("/private//keycomment"), ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void validKeyShouldThrowsExceptionWhenKeyEndsWithSlash() throws 
Exception {
-        MailboxAnnotation.newInstance(new 
MailboxAnnotationKey("/private/keycomment/"), ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void validKeyShouldThrowsExceptionWhenKeyContainsNonASCII() throws 
Exception {
-        MailboxAnnotation.newInstance(new 
MailboxAnnotationKey("/private/key comment"), ANNOTATION_VALUE);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void validKeyShouldThrowsExceptionWhenKeyContainsTabCharacter() 
throws Exception {
-        MailboxAnnotation.newInstance(new 
MailboxAnnotationKey("/private/key\tcomment"), ANNOTATION_VALUE);
+        MailboxAnnotation.newInstance(ANNOTATION_KEY, null);
     }
 
     @Test
@@ -122,7 +76,7 @@ public class MailboxAnnotationTest {
 
     @Test(expected = NullPointerException.class)
     public void 
newInstanceMailboxAnnotationShouldThrowExceptionWithNullValue() throws 
Exception {
-        MailboxAnnotation.newInstance(ANY_KEY, null);
+        MailboxAnnotation.newInstance(ANNOTATION_KEY, null);
     }
 
     @Test
@@ -133,10 +87,4 @@ public class MailboxAnnotationTest {
         assertThat(annotation.getValue()).contains(ANNOTATION_VALUE);
     }
 
-    @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/c25c6740/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
index 7f5171e..995795a 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapper.java
@@ -49,7 +49,6 @@ import com.google.common.base.Preconditions;
 
 public class CassandraAnnotationMapper extends NonTransactionalMapper 
implements AnnotationMapper {
 
-    public static final char MAXIMUM_ASCII_CHARACTER = 127;
     private final CassandraId mailboxId;
     private final Session session;
 
@@ -85,14 +84,14 @@ public class CassandraAnnotationMapper extends 
NonTransactionalMapper implements
     public void deleteAnnotation(MailboxAnnotationKey key) {
         session.execute(delete().from(CassandraAnnotationTable.TABLE_NAME)
             .where(eq(CassandraAnnotationTable.MAILBOX_ID, mailboxId.asUuid()))
-            .and(eq(CassandraAnnotationTable.KEY, key.getKey())));
+            .and(eq(CassandraAnnotationTable.KEY, key.asString())));
     }
 
     public void insertAnnotation(MailboxAnnotation mailboxAnnotation) {
         Preconditions.checkArgument(!mailboxAnnotation.isNil());
         session.execute(insertInto(CassandraAnnotationTable.TABLE_NAME)
             .value(CassandraAnnotationTable.MAILBOX_ID, mailboxId.asUuid())
-            .value(CassandraAnnotationTable.KEY, 
mailboxAnnotation.getKey().getKey())
+            .value(CassandraAnnotationTable.KEY, 
mailboxAnnotation.getKey().asString())
             .value(CassandraAnnotationTable.VALUE, 
mailboxAnnotation.getValue().get()));
     }
 
@@ -120,22 +119,22 @@ public class CassandraAnnotationMapper extends 
NonTransactionalMapper implements
     }
     
     private String buildNextKey(String key) {
-        return key + MailboxAnnotationKey.SLASH_CHARACTER + 
MAXIMUM_ASCII_CHARACTER;
+        return key + MailboxAnnotationKey.SLASH_CHARACTER + Ascii.MAX;
     }
 
     private Stream<MailboxAnnotation> 
getAnnotationsByKeyWithAllDepth(MailboxAnnotationKey key) {
-        return 
CassandraUtils.convertToStream(session.execute(getStoredAnnotationsQueryLikeKey(key.getKey())))
+        return 
CassandraUtils.convertToStream(session.execute(getStoredAnnotationsQueryLikeKey(key.asString())))
             .map(this::toAnnotation);
     }
 
     private Stream<MailboxAnnotation> 
getAnnotationsByKeyWithOneDepth(MailboxAnnotationKey key) {
-        return 
CassandraUtils.convertToStream(session.execute(getStoredAnnotationsQueryLikeKey(key.getKey())))
+        return 
CassandraUtils.convertToStream(session.execute(getStoredAnnotationsQueryLikeKey(key.asString())))
             .map(this::toAnnotation)
             .filter(annotation -> isChild(key, annotation));
     }
 
     private boolean isChild(MailboxAnnotationKey key, MailboxAnnotation 
annotation) {
-        return annotation.getKey().countSlash() <= key.countSlash();
+        return annotation.getKey().countComponents() <= key.countComponents() 
+ 1;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java
----------------------------------------------------------------------
diff --git 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java
 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java
index ff9f962..e433603 100644
--- 
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java
+++ 
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryAnnotationMapper.java
@@ -43,7 +43,7 @@ import com.google.common.collect.Table;
 
 public class InMemoryAnnotationMapper implements AnnotationMapper {
     private final InMemoryId mailboxId;
-    private final Table<InMemoryId, MailboxAnnotationKey, String> 
mailboxesAnnotations;
+    private final Table<InMemoryId, String, String> mailboxesAnnotations;
     private final ReadWriteLock lock = new ReentrantReadWriteLock();
 
     public InMemoryAnnotationMapper(InMemoryId mailboxId) {
@@ -145,7 +145,7 @@ public class InMemoryAnnotationMapper implements 
AnnotationMapper {
         Preconditions.checkArgument(!mailboxAnnotation.isNil());
         lock.writeLock().lock();
         try {
-            mailboxesAnnotations.put(mailboxId, mailboxAnnotation.getKey(), 
mailboxAnnotation.getValue().get());
+            mailboxesAnnotations.put(mailboxId, 
mailboxAnnotation.getKey().asString(), mailboxAnnotation.getValue().get());
         } finally {
             lock.writeLock().unlock();
         }
@@ -155,7 +155,7 @@ public class InMemoryAnnotationMapper implements 
AnnotationMapper {
     public void deleteAnnotation(MailboxAnnotationKey key) {
         lock.writeLock().lock();
         try {
-            mailboxesAnnotations.remove(mailboxId, key);
+            mailboxesAnnotations.remove(mailboxId, key.asString());
         } finally {
             lock.writeLock().unlock();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
index 56a3ee3..c1fdf6c 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
@@ -40,6 +40,7 @@ import com.google.common.collect.Lists;
 @Contract(MapperProvider.class)
 public class AnnotationMapperTest<T extends MapperProvider> {
     private static final MailboxAnnotationKey PRIVATE_USER_KEY = new 
MailboxAnnotationKey("/private/commentuser");
+    private static final MailboxAnnotationKey PRIVATE_UPPER_CASE_KEY = new 
MailboxAnnotationKey("/PRIVATE/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");
@@ -47,6 +48,7 @@ public class AnnotationMapperTest<T extends MapperProvider> {
 
     private static final MailboxAnnotation PRIVATE_USER_ANNOTATION = 
MailboxAnnotation.newInstance(PRIVATE_USER_KEY, "My private comment");
     private static final MailboxAnnotation PRIVATE_ANNOTATION = 
MailboxAnnotation.newInstance(PRIVATE_KEY, "My private comment");
+    private static final MailboxAnnotation PRIVATE_ANNOTATION_WITH_KEY_UPPER = 
MailboxAnnotation.newInstance(PRIVATE_UPPER_CASE_KEY, "The annotation with 
upper key");
     private static final MailboxAnnotation PRIVATE_CHILD_ANNOTATION = 
MailboxAnnotation.newInstance(PRIVATE_CHILD_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");
@@ -193,4 +195,12 @@ public class AnnotationMapperTest<T extends 
MapperProvider> {
 
         
assertThat(annotationMapper.getAnnotationsByKeysWithAllDepth(ImmutableSet.of(PRIVATE_KEY))).isEmpty();
     }
+
+    @ContractTest
+    public void annotationShouldBeCaseInsentive() throws Exception {
+        annotationMapper.insertAnnotation(PRIVATE_ANNOTATION);
+        annotationMapper.insertAnnotation(PRIVATE_ANNOTATION_WITH_KEY_UPPER);
+
+        
assertThat(annotationMapper.getAllAnnotations()).containsOnly(PRIVATE_ANNOTATION_WITH_KEY_UPPER);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
index fb66888..26c372a 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
@@ -28,6 +28,7 @@ import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.base.AbstractImapCommandParser;
 import org.apache.james.imap.message.request.SetAnnotationRequest;
 import org.apache.james.mailbox.model.MailboxAnnotation;
+import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.protocols.imap.DecodingException;
 
 import com.google.common.base.Function;
@@ -66,7 +67,7 @@ public class SetAnnotationCommandParser extends 
AbstractImapCommandParser {
 
             return Optional.fromNullable(value)
                 .transform(transforMailboxAnnotation(key))
-                .or(MailboxAnnotation.nil(key));
+                .or(MailboxAnnotation.nil(createAnnotationKey(key)));
         } catch (IllegalArgumentException e) {
             throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, 
"The key is not valid: " + e.getMessage());
         }
@@ -75,9 +76,13 @@ public class SetAnnotationCommandParser extends 
AbstractImapCommandParser {
     private Function<String, MailboxAnnotation> 
transforMailboxAnnotation(final String key) {
         return new Function<String, MailboxAnnotation>() {
             public MailboxAnnotation apply(String value) {
-                return MailboxAnnotation.newInstance(key, value);
+                return MailboxAnnotation.newInstance(createAnnotationKey(key), 
value);
             }
         };
     }
 
+    private MailboxAnnotationKey createAnnotationKey(String key) {
+        return new MailboxAnnotationKey(key);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
index 9a793c6..3b46532 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
@@ -30,6 +30,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.message.request.SetAnnotationRequest;
 import org.apache.james.mailbox.model.MailboxAnnotation;
+import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.protocols.imap.DecodingException;
 import org.junit.Test;
 
@@ -37,9 +38,12 @@ public class SetAnnotationCommandParserTest {
 
     private static final String INBOX = "anyMailboxName";
     private static final String TAG = "A1";
-    private static final MailboxAnnotation PRIVATE_ANNOTATION = 
MailboxAnnotation.newInstance("/private/comment", "This is my comment");
-    private static final MailboxAnnotation SHARED_ANNOTATION = 
MailboxAnnotation.newInstance("/shared/comment", "This one is for you!");
-    private static final MailboxAnnotation NIL_ANNOTATION = 
MailboxAnnotation.nil("/private/comment");
+    private static final MailboxAnnotationKey PRIVATE_KEY = new 
MailboxAnnotationKey("/private/comment");
+    private static final MailboxAnnotationKey SHARED_KEY = new 
MailboxAnnotationKey("/shared/comment");
+
+    private static final MailboxAnnotation PRIVATE_ANNOTATION = 
MailboxAnnotation.newInstance(PRIVATE_KEY, "This is my comment");
+    private static final MailboxAnnotation SHARED_ANNOTATION = 
MailboxAnnotation.newInstance(SHARED_KEY, "This one is for you!");
+    private static final MailboxAnnotation NIL_ANNOTATION = 
MailboxAnnotation.nil(PRIVATE_KEY);
     private SetAnnotationCommandParser parser = new 
SetAnnotationCommandParser();
     private ImapCommand command = ImapCommand.anyStateCommand("Command");
 
@@ -78,7 +82,7 @@ public class SetAnnotationCommandParserTest {
         SetAnnotationRequest request = (SetAnnotationRequest) 
parser.decode(command, lineReader, TAG, null);
 
         assertThat(request.getMailboxName()).isEqualTo(INBOX);
-        
assertThat(request.getMailboxAnnotations()).containsOnly(MailboxAnnotation.newInstance("/private/comment",
 "My new comment across two lines."));
+        
assertThat(request.getMailboxAnnotations()).containsOnly(MailboxAnnotation.newInstance(PRIVATE_KEY,
 "My new comment across two lines."));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
index 86c4ad9..16e3730 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
@@ -103,7 +103,7 @@ public class AnnotationResponseEncoderTest {
 
         encoder.encode(response, composer, imapSession);
 
-        verify(log).warn("There is nil data of key {} on store: ", 
PRIVATE_KEY.getKey());
+        verify(log).warn("There is nil data of key {} on store: ", 
PRIVATE_KEY.asString());
         assertThat(byteImapResponseWriter.getString()).isEqualTo("* METADATA 
\"INBOX\" ()\r\n");
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c25c6740/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
index 65d62ea..1a76a1e 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
@@ -47,6 +47,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxAnnotation;
+import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.junit.After;
 import org.junit.Before;
@@ -92,7 +93,7 @@ public class SetAnnotationProcessorTest {
 
         mockMailboxSession = new MockMailboxSession("username");
         inbox = MailboxPath.inbox(mockMailboxSession);
-        MAILBOX_ANNOTATIONS = 
ImmutableList.of(MailboxAnnotation.newInstance("/private/key", "anyValue"));
+        MAILBOX_ANNOTATIONS = 
ImmutableList.of(MailboxAnnotation.newInstance(new 
MailboxAnnotationKey("/private/key"), "anyValue"));
         request = new SetAnnotationRequest(TAG, 
ImapCommand.anyStateCommand("Name"), ImapConstants.INBOX_NAME, 
MAILBOX_ANNOTATIONS);
         humanTextCaptor = ArgumentCaptor.forClass(HumanReadableText.class);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to