feat: `UnknownChatroomException` records shard and owned shards
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / persistence / inmemory / InMemoryChatHomeService.java
index 95a30db..29f1312 100644 (file)
@@ -1,30 +1,26 @@
 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.*;
+import java.util.stream.IntStream;
 
 
 @Slf4j
-public class InMemoryChatHomeService implements ChatHomeService
+public class InMemoryChatHomeService
 {
-  private final ShardingStrategy shardingStrategy;
   private final Map<UUID, ChatRoom>[] chatrooms;
 
 
   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)
@@ -41,8 +37,7 @@ public class InMemoryChatHomeService implements ChatHomeService
     chatroomFlux
         .filter(chatRoom ->
         {
-          int shard = shardingStrategy.selectShard(chatRoom.getId());
-          if (owned.contains(shard))
+          if (owned.contains(chatRoom.getShard()))
           {
             return true;
           }
@@ -53,35 +48,29 @@ public class InMemoryChatHomeService implements ChatHomeService
           }
         })
         .toStream()
-        .forEach(chatRoom ->
-        {
-          getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom);
-        });
+        .forEach(chatroom -> chatrooms[chatroom.getShard()].put(chatroom.getId(), chatroom));
   }
 
-  @Override
-  public Mono<ChatRoom> putChatRoom(ChatRoom chatRoom)
+  public void putChatRoom(ChatRoom chatRoom)
   {
-    getChatRoomMapFor(chatRoom).put(chatRoom.getId(), chatRoom);
-    return Mono.just(chatRoom);
+    chatrooms[chatRoom.getShard()].put(chatRoom.getId(), chatRoom);
   }
 
-  @Override
   public Mono<ChatRoom> getChatRoom(int shard, UUID id)
   {
     return Mono.justOrEmpty(chatrooms[shard].get(id));
   }
 
-  @Override
-  public Flux<ChatRoom> getChatRooms(int shard)
+  public int[] getOwnedShards()
   {
-    return Flux.fromStream(chatrooms[shard].values().stream());
+    return IntStream
+        .range(0, chatrooms.length)
+        .filter(i -> chatrooms[i] != null)
+        .toArray();
   }
 
-
-  private Map<UUID, ChatRoom> getChatRoomMapFor(ChatRoom chatRoom)
+  public Flux<ChatRoom> getChatRooms(int shard)
   {
-    int shard = shardingStrategy.selectShard(chatRoom.getId());
-    return chatrooms[shard];
+    return Flux.fromStream(chatrooms[shard].values().stream());
   }
 }