Skip to content

Commit

Permalink
JAMES-2317 Simplify code by using a multimap and copy the result of g…
Browse files Browse the repository at this point in the history
…et to handle concurrency
  • Loading branch information
Raphael Ouazana authored and chibenwa committed Jan 26, 2018
1 parent f9df417 commit 866d09e
Showing 1 changed file with 10 additions and 26 deletions.
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -18,36 +18,31 @@
****************************************************************/ ****************************************************************/
package org.apache.james.mailbox.inmemory.user; package org.apache.james.mailbox.inmemory.user;


import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


import org.apache.james.mailbox.store.transaction.NonTransactionalMapper; import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
import org.apache.james.mailbox.store.user.SubscriptionMapper; import org.apache.james.mailbox.store.user.SubscriptionMapper;
import org.apache.james.mailbox.store.user.model.Subscription; import org.apache.james.mailbox.store.user.model.Subscription;


import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimaps;


public class InMemorySubscriptionMapper extends NonTransactionalMapper implements SubscriptionMapper { public class InMemorySubscriptionMapper extends NonTransactionalMapper implements SubscriptionMapper {


private static final int INITIAL_SIZE = 64; private final ListMultimap<String, Subscription> subscriptionsByUser;
private final Map<String, List<Subscription>> subscriptionsByUser;


public InMemorySubscriptionMapper() { public InMemorySubscriptionMapper() {
subscriptionsByUser = new ConcurrentHashMap<>(INITIAL_SIZE); subscriptionsByUser = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
} }


public synchronized void delete(Subscription subscription) { public synchronized void delete(Subscription subscription) {
final String user = subscription.getUser(); subscriptionsByUser.remove(subscription.getUser(), subscription);
final List<Subscription> subscriptions = subscriptionsByUser.get(user);
if (subscriptions != null) {
subscriptions.remove(subscription);
}
} }


public Subscription findMailboxSubscriptionForUser(String user, String mailbox) { public Subscription findMailboxSubscriptionForUser(String user, String mailbox) {
final List<Subscription> subscriptions = subscriptionsByUser.get(user); final List<Subscription> subscriptions = ImmutableList.copyOf(subscriptionsByUser.get(user));
if (subscriptions != null) { if (subscriptions != null) {
return subscriptions.stream() return subscriptions.stream()
.filter(subscription -> subscription.getMailbox().equals(mailbox)) .filter(subscription -> subscription.getMailbox().equals(mailbox))
Expand All @@ -59,25 +54,14 @@ public Subscription findMailboxSubscriptionForUser(String user, String mailbox)


public List<Subscription> findSubscriptionsForUser(String user) { public List<Subscription> findSubscriptionsForUser(String user) {
final List<Subscription> subcriptions = subscriptionsByUser.get(user); final List<Subscription> subcriptions = subscriptionsByUser.get(user);
final List<Subscription> results;
if (subcriptions == null) { if (subcriptions == null) {
results = ImmutableList.of(); return ImmutableList.of();
} else {
results = ImmutableList.copyOf(subcriptions);
} }
return results; return ImmutableList.copyOf(subcriptions);
} }


public synchronized void save(Subscription subscription) { public synchronized void save(Subscription subscription) {
final String user = subscription.getUser(); subscriptionsByUser.put(subscription.getUser(), subscription);
final List<Subscription> subscriptions = subscriptionsByUser.get(user);
if (subscriptions == null) {
final List<Subscription> newSubscriptions = new ArrayList<>();
newSubscriptions.add(subscription);
subscriptionsByUser.put(user, newSubscriptions);
} else {
subscriptions.add(subscription);
}
} }


public void deleteAll() { public void deleteAll() {
Expand Down

0 comments on commit 866d09e

Please sign in to comment.