TMP:Holzweg so, Refaktorisierung nötig
[demos/kafka/chat] / src / main / java / de / juplo / kafka / chat / backend / persistence / storage / files / FilesStorageStrategy.java
index d043696..e161122 100644 (file)
@@ -3,8 +3,10 @@ package de.juplo.kafka.chat.backend.persistence.storage.files;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import de.juplo.kafka.chat.backend.api.ChatRoomTo;
+import de.juplo.kafka.chat.backend.api.ChatRoomInfoTo;
 import de.juplo.kafka.chat.backend.api.MessageTo;
+import de.juplo.kafka.chat.backend.domain.ChatRoomInfo;
+import de.juplo.kafka.chat.backend.domain.ShardingStrategy;
 import de.juplo.kafka.chat.backend.domain.ChatRoom;
 import de.juplo.kafka.chat.backend.domain.Message;
 import de.juplo.kafka.chat.backend.persistence.StorageStrategy;
@@ -16,6 +18,7 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.time.Clock;
+import java.util.UUID;
 
 import static java.nio.file.StandardOpenOption.CREATE;
 import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
@@ -31,12 +34,13 @@ public class FilesStorageStrategy implements StorageStrategy
   private final Path storagePath;
   private final Clock clock;
   private final int bufferSize;
+  private final ShardingStrategy shardingStrategy;
   private final ChatRoomServiceFactory factory;
   private final ObjectMapper mapper;
 
 
   @Override
-  public void write(Flux<ChatRoom> chatroomFlux)
+  public void write(Flux<ChatRoomInfo> chatroomFlux)
   {
     Path path = chatroomsPath();
     log.info("Writing chatrooms to {}", path);
@@ -79,9 +83,9 @@ public class FilesStorageStrategy implements StorageStrategy
           {
             try
             {
-              ChatRoomTo chatroomTo = ChatRoomTo.from(chatroom);
-              generator.writeObject(chatroomTo);
-              writeMessages(chatroomTo, chatroom.getMessages());
+              ChatRoomInfoTo infoTo = ChatRoomInfoTo.from(chatroom);
+              generator.writeObject(infoTo);
+              writeMessages(infoTo, chatroom.getMessages());
             }
             catch (IOException e)
             {
@@ -98,23 +102,28 @@ public class FilesStorageStrategy implements StorageStrategy
   @Override
   public Flux<ChatRoom> read()
   {
-    JavaType type = mapper.getTypeFactory().constructType(ChatRoomTo.class);
+    JavaType type = mapper.getTypeFactory().constructType(ChatRoomInfoTo.class);
     return Flux
-        .from(new JsonFilePublisher<ChatRoomTo>(chatroomsPath(), mapper, type))
+        .from(new JsonFilePublisher<ChatRoomInfoTo>(chatroomsPath(), mapper, type))
         .log()
-        .map(chatRoomTo -> new ChatRoom(
-            chatRoomTo.getId(),
-            chatRoomTo.getName(),
-            chatRoomTo.getShard(),
-            clock,
-            factory.create(readMessages(chatRoomTo)),
-            bufferSize));
+        .map(infoTo ->
+        {
+          UUID chatRoomId = infoTo.getId();
+          int shard = shardingStrategy.selectShard(chatRoomId);
+          return new ChatRoom(
+              infoTo.getId(),
+              infoTo.getName(),
+              shard,
+              clock,
+              factory.create(readMessages(infoTo)),
+              bufferSize);
+        });
   }
 
-  public void writeMessages(ChatRoomTo chatroomTo, Flux<Message> messageFlux)
+  public void writeMessages(ChatRoomInfoTo infoTo, Flux<Message> messageFlux)
   {
-    Path path = chatroomPath(chatroomTo);
-    log.info("Writing messages for {} to {}", chatroomTo, path);
+    Path path = chatroomPath(infoTo);
+    log.info("Writing messages for {} to {}", infoTo, path);
     try
     {
       Files.createDirectories(storagePath);
@@ -169,11 +178,11 @@ public class FilesStorageStrategy implements StorageStrategy
     }
   }
 
-  public Flux<Message> readMessages(ChatRoomTo chatroomTo)
+  public Flux<Message> readMessages(ChatRoomInfoTo infoTo)
   {
     JavaType type = mapper.getTypeFactory().constructType(MessageTo.class);
     return Flux
-        .from(new JsonFilePublisher<MessageTo>(chatroomPath(chatroomTo), mapper, type))
+        .from(new JsonFilePublisher<MessageTo>(chatroomPath(infoTo), mapper, type))
         .log()
         .map(MessageTo::toMessage);
   }
@@ -183,8 +192,8 @@ public class FilesStorageStrategy implements StorageStrategy
     return storagePath.resolve(Path.of(CHATROOMS_FILENAME));
   }
 
-  Path chatroomPath(ChatRoomTo chatroomTo)
+  Path chatroomPath(ChatRoomInfoTo infoTo)
   {
-    return storagePath.resolve(Path.of(chatroomTo.getId().toString() + ".json"));
+    return storagePath.resolve(Path.of(infoTo.getId().toString() + ".json"));
   }
 }