This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e83add83b46b4afe2083c8776650defba5c59b39
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Tue Feb 19 11:26:30 2019 +0700

    JAMES-2661 Deserializing groups
    
    Use of reflexion is required as new groups could be registered on the fly
---
 .../apache/james/mailbox/events/GenericGroup.java  |  3 +-
 .../org/apache/james/mailbox/events/Group.java     | 30 +++++++++++++
 .../org/apache/james/mailbox/events/GroupTest.java | 49 ++++++++++++++++++++++
 3 files changed, 81 insertions(+), 1 deletion(-)

diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java
index df14453..a679682 100644
--- 
a/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/events/GenericGroup.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.events;
 import java.util.Objects;
 
 public class GenericGroup extends Group {
+    static final String DELIMITER = "-";
     private final String groupName;
 
     public GenericGroup(String groupName) {
@@ -30,7 +31,7 @@ public class GenericGroup extends Group {
 
     @Override
     public String asString() {
-        return super.asString() + "-" + groupName;
+        return super.asString() + DELIMITER + groupName;
     }
 
     @Override
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java
index 9fb9d25..c05fd65 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/Group.java
@@ -21,7 +21,37 @@ package org.apache.james.mailbox.events;
 
 import java.util.Objects;
 
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+
 public class Group {
+    public static class GroupDeserializationException extends Exception {
+        GroupDeserializationException(Throwable cause) {
+            super(cause);
+        }
+    }
+
+    public static Group deserialize(String serializedGroup) throws 
GroupDeserializationException {
+        try {
+            Preconditions.checkNotNull(serializedGroup, "A serialized group 
can not be null");
+            
Preconditions.checkArgument(!Strings.isNullOrEmpty(serializedGroup), "A 
serialized group can not be empty");
+
+            if (serializedGroup.startsWith(GenericGroup.class.getName() + 
GenericGroup.DELIMITER)) {
+                return new 
GenericGroup(serializedGroup.substring(GenericGroup.class.getName().length() + 
1));
+            }
+
+            Class<?> groupClass = Class.forName(serializedGroup);
+            return instanciateGroup(groupClass);
+        } catch (Exception e) {
+            throw new GroupDeserializationException(e);
+        }
+    }
+
+    private static Group instanciateGroup(Class<?> aClass) throws 
InstantiationException, IllegalAccessException {
+        Preconditions.checkArgument(Group.class.isAssignableFrom(aClass), "The 
supplied class is not a group: " + aClass.getName());
+        return (Group) aClass.newInstance();
+    }
+
     public String asString() {
         return getClass().getName();
     }
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java 
b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java
index 6b5fb6b..b28fd9f 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/events/GroupTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.events;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.junit.jupiter.api.Test;
 
@@ -75,4 +76,52 @@ class GroupTest {
     void asStringShouldReturnNameWhenGenericGroup() {
         assertThat(new 
GenericGroup("abc").asString()).isEqualTo("org.apache.james.mailbox.events.GenericGroup-abc");
     }
+
+    @Test
+    void deserializeShouldReturnGroupWhenGenericGroup() throws Exception {
+        
assertThat(Group.deserialize("org.apache.james.mailbox.events.GenericGroup-abc"))
+            .isEqualTo(new GenericGroup("abc"));
+    }
+
+    @Test
+    void deserializeShouldReturnGroupWhenEmptyGenericGroup() throws Exception {
+        
assertThat(Group.deserialize("org.apache.james.mailbox.events.GenericGroup-"))
+            .isEqualTo(new GenericGroup(""));
+    }
+
+    @Test
+    void deserializeShouldReturnGroupWhenExtendsGroup() throws Exception {
+        
assertThat(Group.deserialize("org.apache.james.mailbox.events.EventBusTestFixture$GroupA"))
+            .isEqualTo(new EventBusTestFixture.GroupA());
+    }
+
+    @Test
+    void deserializeShouldThrowWhenClassNotFound() {
+        assertThatThrownBy(() -> 
Group.deserialize("org.apache.james.mailbox.events.Noone"))
+            .isInstanceOf(Group.GroupDeserializationException.class);
+    }
+
+    @Test
+    void deserializeShouldThrowWhenNotAGroup() {
+        assertThatThrownBy(() -> Group.deserialize("java.lang.String"))
+            .isInstanceOf(Group.GroupDeserializationException.class);
+    }
+
+    @Test
+    void deserializeShouldThrowWhenConstructorArgumentsRequired() {
+        assertThatThrownBy(() -> 
Group.deserialize("org.apache.james.mailbox.events.GenericGroup"))
+            .isInstanceOf(Group.GroupDeserializationException.class);
+    }
+
+    @Test
+    void deserializeShouldThrowWhenNull() {
+        assertThatThrownBy(() -> Group.deserialize(null))
+            .isInstanceOf(Group.GroupDeserializationException.class);
+    }
+
+    @Test
+    void deserializeShouldThrowWhenEmpty() {
+        assertThatThrownBy(() -> Group.deserialize(""))
+            .isInstanceOf(Group.GroupDeserializationException.class);
+    }
 }
\ No newline at end of file


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

Reply via email to