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