fix: Removed unnecessary generic in `ChatHomeService`
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / persistence / inmemory / InMemoryChatHomeService.java
index acfd936..95a30db 100644 (file)
@@ -2,36 +2,67 @@ package de.juplo.kafka.chat.backend.persistence.inmemory;
 
 import de.juplo.kafka.chat.backend.domain.ChatRoom;
 import de.juplo.kafka.chat.backend.domain.ChatHomeService;
+import de.juplo.kafka.chat.backend.domain.ShardingStrategy;
 import lombok.extern.slf4j.Slf4j;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
 
 @Slf4j
-public class InMemoryChatHomeService implements ChatHomeService<InMemoryChatRoomService>
+public class InMemoryChatHomeService implements ChatHomeService
 {
+  private final ShardingStrategy shardingStrategy;
   private final Map<UUID, ChatRoom>[] chatrooms;
 
 
-  public InMemoryChatHomeService(int numShards, Flux<ChatRoom> chatroomFlux)
+  public InMemoryChatHomeService(
+      ShardingStrategy shardingStrategy,
+      int numShards,
+      int[] ownedShards,
+      Flux<ChatRoom> chatroomFlux)
   {
     log.debug("Creating InMemoryChatHomeService");
+    this.shardingStrategy = shardingStrategy;
     this.chatrooms = new Map[numShards];
+    Set<Integer> owned = Arrays
+        .stream(ownedShards)
+        .collect(
+            () -> new HashSet<>(),
+            (set, i) -> set.add(i),
+            (a, b) -> a.addAll(b));
     for (int shard = 0; shard < numShards; shard++)
-        chatrooms[shard] = new HashMap<>();
+    {
+      chatrooms[shard] = owned.contains(shard)
+          ? new HashMap<>()
+          : null;
+    }
     chatroomFlux
+        .filter(chatRoom ->
+        {
+          int shard = shardingStrategy.selectShard(chatRoom.getId());
+          if (owned.contains(shard))
+          {
+            return true;
+          }
+          else
+          {
+            log.info("Ignoring not owned chat-room {}", chatRoom);
+            return false;
+          }
+        })
         .toStream()
-        .forEach(chatroom -> chatrooms[chatroom.getShard()].put(chatroom.getId(), chatroom));
+        .forEach(chatRoom ->
+        {
+          getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom);
+        });
   }
 
   @Override
   public Mono<ChatRoom> putChatRoom(ChatRoom chatRoom)
   {
-    chatrooms[chatRoom.getShard()].put(chatRoom.getId(), chatRoom);
+    getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom);
     return Mono.just(chatRoom);
   }
 
@@ -46,4 +77,11 @@ public class InMemoryChatHomeService implements ChatHomeService<InMemoryChatRoom
   {
     return Flux.fromStream(chatrooms[shard].values().stream());
   }
+
+
+  private Map<UUID, ChatRoom> getChatRoomMapFor(ChatRoom chatRoom)
+  {
+    int shard = shardingStrategy.selectShard(chatRoom.getId());
+    return chatrooms[shard];
+  }
 }