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:21:48 UTC

[10/31] james-project git commit: MAILBOX-307 Mailbox ACL JSON representation SHOULD be explicit

MAILBOX-307 Mailbox ACL JSON representation SHOULD be explicit


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

Branch: refs/heads/master
Commit: 649489920fcbef807fdfab54f6624df73e56be78
Parents: 58c84a2
Author: benwa <bt...@linagora.com>
Authored: Wed Sep 27 13:31:33 2017 +0700
Committer: Matthieu Baechler <ma...@apache.org>
Committed: Fri Sep 29 09:20:40 2017 +0200

----------------------------------------------------------------------
 .../apache/james/mailbox/model/MailboxACL.java  | 13 ----
 .../cassandra/mail/CassandraACLMapper.java      | 10 +--
 .../store/json/MailboxACLJsonConverter.java     | 64 ++++++++++++++++++++
 .../json/SimpleMailboxACLJsonConverter.java     | 64 --------------------
 .../store/json/event/MailboxConverter.java      |  6 +-
 .../store/json/MailboxACLJsonConverterTest.java | 27 ++++-----
 6 files changed, 85 insertions(+), 99 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/64948992/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
index 64180fb..a7afa02 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
@@ -199,14 +199,6 @@ public class MailboxACL {
             this.value = EnumSet.of(Right.forChar(right.asCharacter()));
         }
 
-        /* Used for json serialization (probably a bad idea) */
-        public Rfc4314Rights(int serializedRights) {
-            this(copyOf(Right.allRights
-                .stream()
-                .filter(right -> ((serializedRights >> right.ordinal()) & 1) != 0)
-                .collect(Collectors.toList())));
-        }
-
         public Rfc4314Rights(String serializedRfc4314Rights) throws UnsupportedRightException {
             this.value = copyOf(serializedRfc4314Rights.chars()
                 .mapToObj(i -> (char) i)
@@ -264,11 +256,6 @@ public class MailboxACL {
             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();
-        }
-
         public boolean equals(Object o) {
             if (o instanceof Rfc4314Rights) {
                 Rfc4314Rights that = (Rfc4314Rights) o;

http://git-wip-us.apache.org/repos/asf/james-project/blob/64948992/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
index 98d46c7..a0dccf0 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapper.java
@@ -41,7 +41,7 @@ import org.apache.james.mailbox.cassandra.table.CassandraMailboxTable;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
-import org.apache.james.mailbox.store.json.SimpleMailboxACLJsonConverter;
+import org.apache.james.mailbox.store.json.MailboxACLJsonConverter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -143,7 +143,7 @@ public class CassandraACLMapper {
             executor.executeVoid(
                 insertStatement.bind()
                     .setUUID(CassandraACLTable.ID, cassandraId.asUuid())
-                    .setString(CassandraACLTable.ACL, SimpleMailboxACLJsonConverter.toJson(mailboxACL)))
+                    .setString(CassandraACLTable.ACL, MailboxACLJsonConverter.toJson(mailboxACL)))
                 .join();
         } catch (JsonProcessingException e) {
             throw Throwables.propagate(e);
@@ -169,7 +169,7 @@ public class CassandraACLMapper {
             return executor.execute(
                 conditionalUpdateStatement.bind()
                     .setUUID(CassandraACLTable.ID, cassandraId.asUuid())
-                    .setString(CassandraACLTable.ACL,  SimpleMailboxACLJsonConverter.toJson(aclWithVersion.mailboxACL))
+                    .setString(CassandraACLTable.ACL,  MailboxACLJsonConverter.toJson(aclWithVersion.mailboxACL))
                     .setLong(CassandraACLTable.VERSION, aclWithVersion.version + 1)
                     .setLong(OLD_VERSION, aclWithVersion.version))
                 .join();
@@ -183,7 +183,7 @@ public class CassandraACLMapper {
             return executor.execute(
                 conditionalInsertStatement.bind()
                     .setUUID(CassandraACLTable.ID, cassandraId.asUuid())
-                    .setString(CassandraACLTable.ACL, SimpleMailboxACLJsonConverter.toJson(acl)))
+                    .setString(CassandraACLTable.ACL, MailboxACLJsonConverter.toJson(acl)))
                 .join();
         } catch (JsonProcessingException exception) {
             throw Throwables.propagate(exception);
@@ -201,7 +201,7 @@ public class CassandraACLMapper {
 
     private MailboxACL deserializeACL(CassandraId cassandraId, String serializedACL) {
         try {
-            return SimpleMailboxACLJsonConverter.toACL(serializedACL);
+            return MailboxACLJsonConverter.toACL(serializedACL);
         } catch(IOException exception) {
             LOG.error("Unable to read stored ACL. " +
                 "We will use empty ACL instead." +

http://git-wip-us.apache.org/repos/asf/james-project/blob/64948992/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverter.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverter.java
new file mode 100644
index 0000000..8fdfc83
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverter.java
@@ -0,0 +1,64 @@
+/****************************************************************
+ * 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.store.json;
+
+import java.io.IOException;
+
+import org.apache.james.mailbox.model.MailboxACL;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.KeyDeserializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+public class MailboxACLJsonConverter {
+
+    interface Rfc4314RightsMixIn {
+        @JsonValue
+        String serialize();
+    }
+
+    static class ACLKeyDeserializer extends KeyDeserializer {
+        @Override
+        public Object deserializeKey(String key, DeserializationContext deserializationContext) throws IOException {
+            return MailboxACL.EntryKey.deserialize(key);
+        }
+    }
+
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
+    static {
+        SimpleModule module = new SimpleModule()
+                .addKeyDeserializer(MailboxACL.EntryKey.class, new ACLKeyDeserializer());
+        objectMapper
+            .addMixIn(MailboxACL.Rfc4314Rights.class, Rfc4314RightsMixIn.class)
+            .registerModule(module);
+    }
+
+    public static String toJson(MailboxACL acl) throws JsonProcessingException {
+        return objectMapper.writeValueAsString(acl);
+    }
+    
+    public static MailboxACL toACL(String jsonACLString) throws IOException {
+        return objectMapper.readValue(jsonACLString, MailboxACL.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/64948992/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/SimpleMailboxACLJsonConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/SimpleMailboxACLJsonConverter.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/SimpleMailboxACLJsonConverter.java
deleted file mode 100644
index a19e613..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/SimpleMailboxACLJsonConverter.java
+++ /dev/null
@@ -1,64 +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.store.json;
-
-import java.io.IOException;
-
-import org.apache.james.mailbox.model.MailboxACL;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.KeyDeserializer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-
-public class SimpleMailboxACLJsonConverter {
-
-    interface Rfc4314RightsMixIn {
-        @JsonValue
-        int serializeAsInteger();
-    }
-
-    static class ACLKeyDeserializer extends KeyDeserializer {
-        @Override
-        public Object deserializeKey(String key, DeserializationContext deserializationContext) throws IOException {
-            return MailboxACL.EntryKey.deserialize(key);
-        }
-    }
-
-    private static final ObjectMapper objectMapper = new ObjectMapper();
-
-    static {
-        SimpleModule module = new SimpleModule()
-                .addKeyDeserializer(MailboxACL.EntryKey.class, new ACLKeyDeserializer());
-        objectMapper
-            .addMixIn(MailboxACL.Rfc4314Rights.class, Rfc4314RightsMixIn.class)
-            .registerModule(module);
-    }
-
-    public static String toJson(MailboxACL acl) throws JsonProcessingException {
-        return objectMapper.writeValueAsString(acl);
-    }
-    
-    public static MailboxACL toACL(String jsonACLString) throws IOException {
-        return objectMapper.readValue(jsonACLString, MailboxACL.class);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/64948992/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/MailboxConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/MailboxConverter.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/MailboxConverter.java
index 185899e..6df34f5 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/MailboxConverter.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/json/event/MailboxConverter.java
@@ -24,7 +24,7 @@ import java.io.IOException;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.event.EventFactory;
-import org.apache.james.mailbox.store.json.SimpleMailboxACLJsonConverter;
+import org.apache.james.mailbox.store.json.MailboxACLJsonConverter;
 import org.apache.james.mailbox.store.json.event.dto.MailboxDataTransferObject;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxIdDeserialisationException;
@@ -51,7 +51,7 @@ public class MailboxConverter {
             mailboxDataTransferObject.getName()),
             mailboxDataTransferObject.getUidValidity());
         try {
-            mailbox.setACL(SimpleMailboxACLJsonConverter.toACL(mailboxDataTransferObject.getSerializedACL()));
+            mailbox.setACL(MailboxACLJsonConverter.toACL(mailboxDataTransferObject.getSerializedACL()));
             mailbox.setMailboxId(mailboxIdDeserializer.deserialize(mailboxDataTransferObject.getSerializedMailboxId()));
         } catch (IOException e) {
             LOGGER.warn("Failed to deserialize ACL", e);
@@ -82,7 +82,7 @@ public class MailboxConverter {
 
     private String getSerializedACL(Mailbox mailbox) {
         try {
-            return SimpleMailboxACLJsonConverter.toJson(mailbox.getACL());
+            return MailboxACLJsonConverter.toJson(mailbox.getACL());
         } catch (JsonProcessingException e) {
             return "{\"entries\":{}}";
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/64948992/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverterTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverterTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverterTest.java
index 99bcd8f..fb8dcbb 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverterTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/json/MailboxACLJsonConverterTest.java
@@ -66,7 +66,6 @@ public class MailboxACLJsonConverterTest {
         }
 
         public ACLMapBuilder addSingleGroupEntryToMap() {
-
             Rfc4314Rights rights = new Rfc4314Rights(DeleteMailbox, DeleteMessages, Lookup, Post, Read, Write, WriteSeenFlag);
             EntryKey key = new EntryKey("group", NameType.group, true);
             map.put(key, rights);
@@ -81,59 +80,59 @@ public class MailboxACLJsonConverterTest {
 
     @Test
     public void emptyACLShouldBeWellSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toJson(MailboxACL.EMPTY))
+        assertThatJson(MailboxACLJsonConverter.toJson(MailboxACL.EMPTY))
             .isEqualTo("{\"entries\":{}}")
             .when(Option.IGNORING_ARRAY_ORDER);
     }
 
     @Test
     public void singleUserEntryACLShouldBeWellSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleUserEntryToMap().buildAsACL()))
-            .isEqualTo("{\"entries\":{\"-user\":2040}}")
+        assertThatJson(MailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleUserEntryToMap().buildAsACL()))
+            .isEqualTo("{\"entries\":{\"-user\":\"klprstwx\"}}")
             .when(Option.IGNORING_ARRAY_ORDER);
     }
 
     @Test
     public void singleGroupEntryACLShouldBeWellSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleGroupEntryToMap().buildAsACL()))
-            .isEqualTo("{\"entries\":{\"-$group\":2032}}")
+        assertThatJson(MailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleGroupEntryToMap().buildAsACL()))
+            .isEqualTo("{\"entries\":{\"-$group\":\"lprstwx\"}}")
             .when(Option.IGNORING_ARRAY_ORDER);
     }
 
     @Test
     public void singleSpecialEntryACLShouldBeWellSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleSpecialEntryToMap().buildAsACL()))
-            .isEqualTo("{\"entries\":{\"-special\":1968}}")
+        assertThatJson(MailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleSpecialEntryToMap().buildAsACL()))
+            .isEqualTo("{\"entries\":{\"-special\":\"lpstwx\"}}")
             .when(Option.IGNORING_ARRAY_ORDER);
     }
 
     @Test
     public void multipleEntriesACLShouldBeWellSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleUserEntryToMap().addSingleGroupEntryToMap().buildAsACL()))
-            .isEqualTo("{\"entries\":{\"-user\":2040,\"-$group\":2032}}")
+        assertThatJson(MailboxACLJsonConverter.toJson(new ACLMapBuilder().addSingleUserEntryToMap().addSingleGroupEntryToMap().buildAsACL()))
+            .isEqualTo("{\"entries\":{\"-user\":\"klprstwx\",\"-$group\":\"lprstwx\"}}")
             .when(Option.IGNORING_ARRAY_ORDER);
     }
 
     @Test
     public void emptyACLShouldBeWellDeSerialized() throws Exception {
-        assertThat(SimpleMailboxACLJsonConverter.toACL("{\"entries\":{}}")).isEqualTo(MailboxACL.EMPTY);
+        assertThat(MailboxACLJsonConverter.toACL("{\"entries\":{}}")).isEqualTo(MailboxACL.EMPTY);
     }
 
     @Test
     public void singleUserEntryACLShouldBeWellDeSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toACL("{\"entries\":{\"-user\":2040}}"))
+        assertThatJson(MailboxACLJsonConverter.toACL("{\"entries\":{\"-user\":\"klprstwx\"}}"))
             .isEqualTo(new ACLMapBuilder().addSingleUserEntryToMap().buildAsACL());
     }
 
     @Test
     public void singleGroupEntryACLShouldBeWellDeSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toACL("{\"entries\":{\"-$group\":2032}}"))
+        assertThatJson(MailboxACLJsonConverter.toACL("{\"entries\":{\"-$group\":\"lprstwx\"}}"))
             .isEqualTo(new ACLMapBuilder().addSingleGroupEntryToMap().buildAsACL());
     }
 
     @Test
     public void multipleEntriesACLShouldBeWellDeSerialized() throws Exception {
-        assertThatJson(SimpleMailboxACLJsonConverter.toACL("{\"entries\":{\"-user\":2040,\"-$group\":2032}}"))
+        assertThatJson(MailboxACLJsonConverter.toACL("{\"entries\":{\"-user\":\"klprstwx\",\"-$group\":\"lprstwx\"}}"))
             .isEqualTo(new ACLMapBuilder().addSingleUserEntryToMap().addSingleGroupEntryToMap().buildAsACL());
     }
 


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