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 bt...@apache.org on 2019/11/19 02:43:35 UTC

[james-project] 33/43: JAMES-2949 Username strong typing for subscriptions

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 11ed2708cbe6faacae4dfb67baa1ca77a6d96f93
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 14 14:58:21 2019 +0700

    JAMES-2949 Username strong typing for subscriptions
---
 .../cassandra/user/CassandraSubscriptionMapper.java       | 15 ++++++++-------
 .../apache/james/mailbox/jpa/JPASubscriptionManager.java  |  2 +-
 .../james/mailbox/jpa/user/JPASubscriptionMapper.java     | 13 +++++++++----
 .../james/mailbox/jpa/user/model/JPASubscription.java     |  9 +++++----
 .../mailbox/maildir/user/MaildirSubscriptionMapper.java   | 14 +++++++-------
 .../mailbox/inmemory/user/InMemorySubscriptionMapper.java |  7 ++++---
 .../james/mailbox/store/StoreSubscriptionManager.java     |  8 ++++----
 .../james/mailbox/store/user/SubscriptionMapper.java      |  6 +++---
 .../james/mailbox/store/user/model/Subscription.java      |  4 +++-
 .../mailbox/store/user/model/impl/SimpleSubscription.java |  7 ++++---
 .../james/mailbox/store/user/SubscriptionMapperTest.java  |  5 +++--
 11 files changed, 51 insertions(+), 39 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java
index a1ce340..bc9e7ff 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
@@ -53,25 +54,25 @@ public class CassandraSubscriptionMapper extends NonTransactionalMapper implemen
     public synchronized void delete(Subscription subscription) {
         session.execute(QueryBuilder.delete()
             .from(TABLE_NAME)
-            .where(eq(USER, subscription.getUser()))
+            .where(eq(USER, subscription.getUser().asString()))
             .and(eq(MAILBOX, subscription.getMailbox())));
     }
 
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) {
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) {
         ResultSet results = session.execute(select(MAILBOX)
             .from(TABLE_NAME)
-            .where(eq(USER, user))
+            .where(eq(USER, user.asString()))
             .and(eq(MAILBOX, mailbox)));
         return !results.isExhausted() ? new SimpleSubscription(user, mailbox) : null;
     }
 
     @Override
-    public List<Subscription> findSubscriptionsForUser(String user) {
+    public List<Subscription> findSubscriptionsForUser(Username user) {
         return cassandraUtils.convertToStream(
             session.execute(select(MAILBOX)
                 .from(TABLE_NAME)
-                .where(eq(USER, user))))
+                .where(eq(USER, user.asString()))))
             .map((row) -> new SimpleSubscription(user, row.getString(MAILBOX)))
             .collect(Collectors.toList());
     }
@@ -79,7 +80,7 @@ public class CassandraSubscriptionMapper extends NonTransactionalMapper implemen
     @Override
     public synchronized void save(Subscription subscription) {
         session.execute(insertInto(TABLE_NAME)
-            .value(USER, subscription.getUser())
+            .value(USER, subscription.getUser().asString())
             .value(MAILBOX, subscription.getMailbox()));
     }
 
@@ -87,7 +88,7 @@ public class CassandraSubscriptionMapper extends NonTransactionalMapper implemen
         return cassandraUtils.convertToStream(
             session.execute(select(FIELDS)
                 .from(TABLE_NAME)))
-            .map((row) -> new SimpleSubscription(row.getString(USER), row.getString(MAILBOX)))
+            .map((row) -> new SimpleSubscription(Username.of(row.getString(USER)), row.getString(MAILBOX)))
             .collect(Collectors.toList());
     }
 
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java
index fae41ba..7fb342e 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java
@@ -38,6 +38,6 @@ public class JPASubscriptionManager extends StoreSubscriptionManager {
     
     @Override
     protected Subscription createSubscription(MailboxSession session, String mailbox) {
-        return new JPASubscription(session.getUser().asString(), mailbox);
+        return new JPASubscription(session.getUser(), mailbox);
     }
 }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java
index 7d41117..a096632 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java
@@ -24,6 +24,7 @@ import javax.persistence.EntityManagerFactory;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceException;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.jpa.JPATransactionalMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -40,10 +41,12 @@ public class JPASubscriptionMapper extends JPATransactionalMapper implements Sub
 
     
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) throws SubscriptionException {
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) throws SubscriptionException {
         try {
             return (Subscription) getEntityManager().createNamedQuery("findFindMailboxSubscriptionForUser")
-            .setParameter("userParam", user).setParameter("mailboxParam", mailbox).getSingleResult();
+            .setParameter("userParam", user.asString())
+                .setParameter("mailboxParam", mailbox)
+                .getSingleResult();
         } catch (NoResultException e) {
             return null;
         } catch (PersistenceException e) {
@@ -62,9 +65,11 @@ public class JPASubscriptionMapper extends JPATransactionalMapper implements Sub
 
     @Override
     @SuppressWarnings("unchecked")
-    public List<Subscription> findSubscriptionsForUser(String user) throws SubscriptionException {
+    public List<Subscription> findSubscriptionsForUser(Username user) throws SubscriptionException {
         try {
-            return (List<Subscription>) getEntityManager().createNamedQuery("findSubscriptionsForUser").setParameter("userParam", user).getResultList();
+            return (List<Subscription>) getEntityManager().createNamedQuery("findSubscriptionsForUser")
+                .setParameter("userParam", user.asString())
+                .getResultList();
         } catch (PersistenceException e) {
             throw new SubscriptionException(e);
         }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java
index 5cb4a52..785ce13 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java
@@ -28,6 +28,7 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.user.model.Subscription;
 
 /**
@@ -81,9 +82,9 @@ public class JPASubscription implements Subscription {
      * @param username not null
      * @param mailbox not null
      */
-    public JPASubscription(String username, String mailbox) {
+    public JPASubscription(Username username, String mailbox) {
         super();
-        this.username = username;
+        this.username = username.asString();
         this.mailbox = mailbox;
     }
 
@@ -93,8 +94,8 @@ public class JPASubscription implements Subscription {
     }
     
     @Override
-    public String getUser() {
-        return username;
+    public Username getUser() {
+        return Username.of(username);
     }
 
     @Override
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
index 55fceb3..dee6ac7 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
@@ -58,7 +58,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
         boolean changed = subscriptionNames.size() != newSubscriptions.size();
         if (changed) {
             try {
-                writeSubscriptions(new File(store.userRoot(Username.of(subscription.getUser()))), newSubscriptions);
+                writeSubscriptions(new File(store.userRoot(subscription.getUser())), newSubscriptions);
             } catch (IOException e) {
                 throw new SubscriptionException(e);
             }
@@ -66,7 +66,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
     }
 
     @Override
-    public List<Subscription> findSubscriptionsForUser(String user) throws SubscriptionException {
+    public List<Subscription> findSubscriptionsForUser(Username user) throws SubscriptionException {
         Set<String> subscriptionNames = readSubscriptionsForUser(user);
         return subscriptionNames.stream()
             .map(subscription -> new SimpleSubscription(user, subscription))
@@ -74,8 +74,8 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
     }
 
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) throws SubscriptionException {
-        File userRoot = new File(store.userRoot(Username.of(user)));
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) throws SubscriptionException {
+        File userRoot = new File(store.userRoot(user));
         Set<String> subscriptionNames;
         try {
             subscriptionNames = readSubscriptions(userRoot);
@@ -99,7 +99,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
         boolean changed = subscriptionNames.size() != newSubscriptions.size();
         if (changed) {
             try {
-                writeSubscriptions(new File(store.userRoot(Username.of(subscription.getUser()))), newSubscriptions);
+                writeSubscriptions(new File(store.userRoot(subscription.getUser())), newSubscriptions);
             } catch (IOException e) {
                 throw new SubscriptionException(e);
             }
@@ -117,8 +117,8 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
      * @param user The user to get the subscriptions for
      * @return A Set of names of subscribed mailboxes of the user
      */
-    private Set<String> readSubscriptionsForUser(String user) throws SubscriptionException { 
-        File userRoot = new File(store.userRoot(Username.of(user)));
+    private Set<String> readSubscriptionsForUser(Username user) throws SubscriptionException {
+        File userRoot = new File(store.userRoot(user));
         try {
             return readSubscriptions(userRoot);
         } catch (IOException e) {
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java
index d0c8336..a94de8c 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.inmemory.user;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
@@ -31,7 +32,7 @@ import com.google.common.collect.Multimaps;
 
 public class InMemorySubscriptionMapper extends NonTransactionalMapper implements SubscriptionMapper {
     
-    private final ListMultimap<String, Subscription> subscriptionsByUser;
+    private final ListMultimap<Username, Subscription> subscriptionsByUser;
     
     public InMemorySubscriptionMapper() {
         subscriptionsByUser = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
@@ -43,7 +44,7 @@ public class InMemorySubscriptionMapper extends NonTransactionalMapper implement
     }
 
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) {
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) {
         final List<Subscription> subscriptions = ImmutableList.copyOf(subscriptionsByUser.get(user));
         if (subscriptions != null) {
             return subscriptions.stream()
@@ -55,7 +56,7 @@ public class InMemorySubscriptionMapper extends NonTransactionalMapper implement
     }
 
     @Override
-    public List<Subscription> findSubscriptionsForUser(String user) {
+    public List<Subscription> findSubscriptionsForUser(Username user) {
         final List<Subscription> subcriptions = subscriptionsByUser.get(user);
         if (subcriptions == null) {
             return ImmutableList.of();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java
index 4533368..f678ff1 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java
@@ -54,7 +54,7 @@ public class StoreSubscriptionManager implements SubscriptionManager {
         final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session);
         try {
             mapper.execute(Mapper.toTransaction(() -> {
-                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().asString(), mailbox);
+                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser(), mailbox);
                 if (subscription == null) {
                     Subscription newSubscription = createSubscription(session, mailbox);
                     mapper.save(newSubscription);
@@ -71,13 +71,13 @@ public class StoreSubscriptionManager implements SubscriptionManager {
      * If you need something more special just override this method
      */
     protected Subscription createSubscription(MailboxSession session, String mailbox) {
-        return new SimpleSubscription(session.getUser().asString(), mailbox);
+        return new SimpleSubscription(session.getUser(), mailbox);
     }
 
     @Override
     public Collection<String> subscriptions(MailboxSession session) throws SubscriptionException {
         return mapperFactory.getSubscriptionMapper(session)
-            .findSubscriptionsForUser(session.getUser().asString())
+            .findSubscriptionsForUser(session.getUser())
             .stream()
             .map(Subscription::getMailbox)
             .collect(Collectors.toCollection(() -> new HashSet<>(INITIAL_SIZE)));
@@ -88,7 +88,7 @@ public class StoreSubscriptionManager implements SubscriptionManager {
         final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session);
         try {
             mapper.execute(Mapper.toTransaction(() -> {
-                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().asString(), mailbox);
+                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser(), mailbox);
                 if (subscription != null) {
                     mapper.delete(subscription);
                 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java
index 48ee42f..0b10e5c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.store.user;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.store.transaction.Mapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
@@ -38,8 +39,7 @@ public interface SubscriptionMapper extends Mapper {
      * @return <code>Subscription</code>, 
      * or null when the user is not subscribed to the given mailbox
      */
-    Subscription findMailboxSubscriptionForUser(
-        final String user, String mailbox) throws SubscriptionException;
+    Subscription findMailboxSubscriptionForUser(Username user, String mailbox) throws SubscriptionException;
 
     /**
      * Saves the given subscription.
@@ -52,7 +52,7 @@ public interface SubscriptionMapper extends Mapper {
      * @param user not null
      * @return not null
      */
-    List<Subscription> findSubscriptionsForUser(String user) throws SubscriptionException;
+    List<Subscription> findSubscriptionsForUser(Username user) throws SubscriptionException;
 
     /**
      * Deletes the given subscription.
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java
index a967b58..c2ad141 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.user.model;
 
+import org.apache.james.core.Username;
+
 /**
  * 
  * Subscription of a mailbox to a user
@@ -40,6 +42,6 @@ public interface Subscription {
      * 
      * @return not null
      */
-    String getUser();
+    Username getUser();
 
 }
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java
index 7b34615..2d01c99 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java
@@ -18,16 +18,17 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.user.model.impl;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.user.model.Subscription;
 
 import com.google.common.base.Objects;
 
 public class SimpleSubscription implements Subscription {
 
-    private final String user;
+    private final Username user;
     private final String mailbox;
     
-    public SimpleSubscription(String user, String mailbox) {
+    public SimpleSubscription(Username user, String mailbox) {
         this.user = user;
         this.mailbox = mailbox;
     }
@@ -38,7 +39,7 @@ public class SimpleSubscription implements Subscription {
     }
 
     @Override
-    public String getUser() {
+    public Username getUser() {
         return user;
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
index f085ff8..81a5286 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.store.user.model.Subscription;
 import org.apache.james.mailbox.store.user.model.impl.SimpleSubscription;
@@ -30,8 +31,8 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 public abstract class SubscriptionMapperTest {
-    private static final String USER_1 = "user1";
-    private static final String USER_2 = "user2";
+    private static final Username USER_1 = Username.of("user1");
+    private static final Username USER_2 = Username.of("user2");
     private static final String MAILBOX_1 = "mailbox1";
     private static final String MAILBOX_2 = "mailbox2";
 


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